Feign Client如何正确处理服务返回的JsonObject类型响应
问题原因
之前三种写法失败的核心原因是Spring Boot默认集成的Feign使用Jackson作为序列化/反序列化工具:
- Jackson无法直接识别Gson的
JsonObject、Fastjson的JSONObject类型,反序列化时要么丢失字段输出{},要么抛出类型不匹配异常 - 返回
Object类型时Jackson会默认将JSON反序列化为LinkedHashMap,无法直接适配后续用Jayway JsonPath解析的需求
最优解决方案(推荐)
直接让Feign接口返回原始JSON字符串,不需要修改任何全局配置,完全避开不同JSON库的兼容问题,拿到字符串后可以直接喂给Jayway JsonPath提取字段。
Feign接口写法
@FeignClient(name = "ABC") public interface TestDataProviderApi { @GetMapping(value = "/v1/path/{data-type}", produces = MediaType.APPLICATION_JSON_VALUE) String getData(@PathVariable("data-type") String dataType); }
调用后解析代码示例
// 调用Feign接口拿到原始JSON字符串 String jsonResponse = testDataProviderApi.getData("你的业务参数"); // 直接用Jayway JsonPath提取对应字段,比如提取a的值 Integer fieldA = JsonPath.read(jsonResponse, "$.a");
备选方案(适配Gson对象接收)
如果确实需要直接用Gson的JsonObject接收响应,可以单独给该Feign客户端配置Gson消息转换器:
1. 自定义Feign配置类
@Configuration public class GsonFeignConfig { @Bean public Decoder gsonDecoder() { return new SpringDecoder(() -> new HttpMessageConverters(new GsonHttpMessageConverter())); } @Bean public Encoder gsonEncoder() { return new SpringEncoder(() -> new HttpMessageConverters(new GsonHttpMessageConverter())); } }
2. Feign接口绑定配置
@FeignClient(name = "ABC", configuration = GsonFeignConfig.class) public interface TestDataProviderApi { @GetMapping(value = "/v1/path/{data-type}", produces = MediaType.APPLICATION_JSON_VALUE) JsonObject getData(@PathVariable("data-type") String dataType); }
3. 解析代码示例
JsonObject jsonObject = testDataProviderApi.getData("你的业务参数"); // 转成字符串后用JsonPath解析 Integer fieldA = JsonPath.read(jsonObject.toString(), "$.a");
注意:如果项目同时使用Jackson和Gson,该方案需要注意消息转换器优先级,避免影响其他业务接口的序列化逻辑。
内容的提问来源于stack exchange,提问作者Forece85
相关产品推荐
相关产品推荐

