需要檢查
1)接口的請求參數是否一致
2)請求參數是否正確添加映射
3)請求方式是否正確
報錯信息如下:
排查出錯信息:
/**
* @RestController WEB層返回前端json數據
* @param tbItem 商品參數
* @param desc 商品描述
* @param itemParams 商品規格
* @return
*/
@RequestMapping("/insertTbItem")
public Result insertTbItem(TbItem tbItem, @RequestParam("desc") String desc, @RequestParam("itemParams")String itemParams){
Integer flag=itemServiceFeign.insertTbItem(tbItem,desc,itemParams);
if(flag != 0){
return Result.ok("Ok");
}else {
return Result.error("Error");
}
}
顯然這里並沒有錯,接着往下找
@FeignClient("item-service")
public interface ItemServiceFeign {
/**
* Feign接口
* -->數據量較小在這里采取get請求
* 在傳遞參數時,多個參數@RequestParam 必須指定名稱
* 傳遞對象參數類型時必須加上@RequestBody,並且參數列表中只能有一個@RequestBody
* @param tbItem
* @param desc
* @param itemParams
* @return
*/
@GetMapping("/service/item/insertTbItem")
Integer insertTbItem(@RequestBody TbItem tbItem, @RequestParam(value = "desc") String desc, @RequestParam(value = "itemParams") String itemParams);
Feign接口也沒有錯,再排查遠程服務提供方:
@RestController
@RequestMapping("/service/item")
public class ItemController {
@Autowired
private ItemService itemService;
/**
*
* @param tbItem
* @param desc
* @param itemParams
* @return
*/
@GetMapping("/insertTbItem")
Integer insertTbItem(@RequestBody TbItem tbItem, @RequestParam(value = "desc") String desc, @RequestParam(value = "itemParams") String itemParams){
return itemService.insertTbItem(tbItem, desc, itemParams);
}
明明Feign發送的是Get請求,到了提供者這邊卻變成了Post
原因:因為Feign默認使用的連接工具實現類,所以里面發現只要你有body體對象,就會強制的把GET請求轉換成POST請求。
解決辦法:
1)在Feign接口pom.xml中加入依賴
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.9</version>
</dependency>
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
<version>10.2.3</version>
</dependency>
2)在服務調用方加入
feign:
httpclient:
enabled: true
最后重啟,解決問題!!!