【Feign】解决--feign.FeignException$MethodNotAllowed: status 405 reading
需要检查
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
最后重启,解决问题!!!