報錯:feign.FeignException: status 400 reading xxx 異常
具體就是feign接口在調用生產者提供的某個方法時異常,無法正常調用。
百思不得其解,因為feign接口和生產者控制器中所寫的方法名是一模一樣的。
都是:
@RequestMapping("/loginLog_logs")
public List<LoginLog> getMyLoginLogs(String username);
為了排除是生產者方面的問題,進行Junit單元測試之后,排除了這種可能。
折騰一個多小時,最后百度了一番,發現有很多種說法:
1-調用服務的時候,消費者接口中的@RequestParam注解中的value值和服務提供者的controller里面的@RequestParam注解里面的value值一定要保持一致,不然就會報這個錯誤。
2-Feign 請求服務,在Controller
之上的 xxx
Mapping 的注解,如果使用 @RequestMapping
的話, 需要聲明method
屬性, 否則就會引發這個異常。即@RequstMapping方法沒有指定請求方式。
3-Feign的那個方法使用的@RequestParam注解,而接收的參數長度過長,就會導致報400錯誤,這時需要換為@RequestBody。
都是什么鬼,發現和我的情況都不一樣,問題並沒有解決。
最后試着嘗試在Feign接口和生產者控制器的方法的參數前加上@RequestParam之后,再指定參數的名字,
@RequestMapping("/loginLog_logs")
public List<LoginLog> getMyLoginLogs(@RequestParam(name="name") String username);
問題竟然解決了。。
也就是說,在遇到這種情況的時候,即使Feign接口和生產者控制器的方法一模一樣,但是因為參數沒有加上@RequestParam且指定參數屬性的名字,就會導致Feign無法成功調用生產端的這個方法。。
同時還可能會報錯顯示為:java.lang.IllegalStateException: RequestParam.value() was empty on parameter 0
天坑啊。