Feign不支持直接使用对象作为参数请求
接口中如果有多参数需要用实体接收,要么把参数一个一个摆开,要么在对象参数上加上@RequestBody注解,让其以json方式接收,如:
@PostMapping("/account/insert")ResultData<String> insert(@RequestBody AccountDTO accountDTO);
消费者模块启动类上使用@EnableFeignClients注解后一定要指明Feign接口所在的包路径
如:@EnableFeignClients(basePackages = "com.xxxxx.feign.*")
否则你的消费者启动时会报如下的错误:
2.png
所以这里推荐你们在开发中所有feign模块最好能统一包名前缀com.xxxxx.feign
@RequestParam的坑在Feign接口层使用@RequestParam注解要注意,一定要加上value属性,
如:ResultData delete(@RequestParam("accountCode") String accountCode);
否则你会看到类似如下的错误:
Caused by: java.lang.IllegalStateException: RequestParam.value() was empty on parameter 0这个异常
@PathVariable的坑在Feign接口层使用@PathVariable注解要注意,一定要跟上面一样加上value属性,
如:ResultData getByCode(@PathVariable(value ="accountCode") String accountCode);
否则你也会看到类似如下的错误:
Caused by: java.lang.IllegalStateException: RequestParam.value() was empty on parameter 0这个异常
在消费者配置文件中添加Feign超时时间配置
feign:
client:
config:
default:
connectTimeout: 5000
readTimeout: 5000
否则你会经常看到如下所示的错误:
java.net.SocketTimeoutException: Read timed out
at java.net.SocketInputStream.socketRead0(Native Method) ~[?:1.8.0_112]
网友评论