FeignClient+Hystrix实现GET请求报too many Body parameters如何解决?
问题原因
OpenFeign在处理GET请求时,默认会将没有明确指定参数注解的方法参数识别为请求体(RequestBody),而HTTP GET协议仅允许最多0个请求体,你的Feign接口存在2个无注解的POJO参数,Feign判定为2个Body,因此抛出Method has too many Body parameters异常。
解决方案
方案1:使用@SpringQueryMap注解(推荐)
Spring Cloud OpenFeign 2.1.0及以上版本提供了@SpringQueryMap注解,可自动将POJO对象的属性解析为GET请求的查询参数,仅需修改Feign接口代码即可,服务提供方无需任何调整:
@FeignClient( name = "PARSER-FILE-SERVICE", url = "http://localhost:8080/cars", fallback = ParserServiceFallback.class ) public interface ParserServiceFeignClient { @GetMapping() ResponseEntity<Page<CarDto>> getCars(@SpringQueryMap CarFilter carFilter, @SpringQueryMap Pageable page); }
该方案改动最小,完全符合REST API设计规范。如果使用原生Feign的@QueryMap注解,需注意其不支持嵌套对象解析,优先选择Spring提供的@SpringQueryMap。
方案2:合并参数传递
若Spring Cloud版本较低不支持@SpringQueryMap,可将CarFilter和Pageable的属性合并到一个自定义查询参数类中,或者转换为Map<String, Object>类型参数,统一加@RequestParam注解传递。
方案3:拆分单个参数
若参数数量较少,可将所有属性拆分为单个参数,分别添加@RequestParam注解:
@GetMapping() ResponseEntity<Page<CarDto>> getCars( @RequestParam(required = false) String mark, @RequestParam(required = false) Integer year, @RequestParam(required = false) String color, @RequestParam(required = false) String country, @RequestParam(required = false) Integer page, @RequestParam(required = false) Integer size, @RequestParam(required = false) String sort );
该方案缺点是参数较多时代码冗余度高,维护成本高。
内容的提问来源于stack exchange,提问作者Денис Дергачев
相关产品推荐
相关产品推荐

