Feign Client调用报400错误无法将响应转换为自定义对象如何解决
问题根因
你遇到的400错误属于请求层面错误,和响应结果反序列化逻辑无关,你的MyClass定义、ObjectMapper转JSON逻辑都没有问题,错误根因为以下两点:
- Feign接口未指定请求的媒体类型:你当前的
@RequestMapping注解仅配置了produces(指定接口响应的媒体类型),缺少consumes配置声明请求体的媒体类型。当你传入String类型的@RequestBody参数时,Feign默认会用text/plain作为Content-Type发送请求,而被调用的服务端接口要求请求的Content-Type必须为application/json,因此直接返回400拒绝请求。 - 小概率场景:你传入的
query字符串本身不是合法JSON格式,服务端解析请求体失败返回400。
解决方案
- 第一步:给Feign接口的
@RequestMapping注解添加consumes配置,指定请求媒体类型为JSON,修改后代码如下:
@FeignClient(name = "service") public interface ServiceClient { @RequestMapping(method = RequestMethod.POST, value = "/url", produces = MediaType.APPLICATION_JSON_UTF8_VALUE, consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) @ApiOperation(value = "process") List<MyClass> select(@RequestBody String query); }
- 第二步:校验你传入的
query字符串格式,确保为合法JSON,不存在语法错误。 - 第三步(可选排查手段):如果修改后仍报错,开启Feign的请求日志打印功能,查看实际发出的请求头、请求体内容定位问题。开启方式为在配置中设置Feign日志级别为
FULL,同时注入对应配置Bean:
@Configuration public class FeignConfig { @Bean Logger.Level feignLoggerLevel() { return Logger.Level.FULL; } }
内容的提问来源于stack exchange,提问作者david
相关产品推荐
相关产品推荐

