问题
原来以为 feignClient 的接口与 Controller 的接口完全相同,复制就可以了,如
Controller中接口定义如下
@PostMapping("/findUserByPage")
List<User> findUserByPage(Long age, String name){
return ...;
}
则对应的 Feign 就是
@PostMapping("/findUserByPage")
List<User> findUserByPage(Long age, String name);
但是遇到了报错
org.springframework.beans.factory.BeanCreationException:
Error creating bean with name '***.UserFeignClient':
FactoryBean threw exception on object creation; nested exception is java.lang.IllegalStateException:
Method has too many Body parameters:
public abstract ***.UserFeignClient.findByPage(java.lang.Integer,java.lang.Integer)
解释
Spring MVC 中,默认从URL中接收参数,比如:
@PostMapping("/findUserByPage")
List<User> findUserByPage(Long age, String name){
return ...;
}
等效于
@PostMapping("/findUserByPage")
List<User> findUserByPage(@RequestParam Long age,@RequestParam String name){
return ...;
}
而在 Feign 中,方法参数并不会像 Spring MVC 那样自动绑定到 URL 参数,当没有使用 @RequestParam 时,Feign 会将方法参数默认处理为请求体内容,一个请求不能有多个请求体,所以当 feign 接口有多个参数,且省略了@RequestParam,就会报错Method has too many Body parameters:
结论
SpringMVC 默认是URL传参,参数没指定@RequestParam或@RequestBody时,默认是@RequestParam,而 Feign 中相反,默认是@RequestBody,在 Feign 的接口中,@RequestParam 不能省略,必须使用 @RequestParam 来明确指定 URL 查询参数。