【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

最后重启,解决问题!!!

posted @ 2020-11-10 13:58  鲸鱼zhang  阅读(2262)  评论(0编辑  收藏  举报