SpringCloud使用feign调用错误的问题

 更新时间:2023年06月02日 15:32:46   作者:想学Java的小码农  
这篇文章主要介绍了SpringCloud使用feign调用错误的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

SpringCloud使用feign调用错误

首先启动类上扫描接口:

@EnableFeignClients(value = {"com.xxx.*.xxx.controller"})

不然编译器会报红色波浪线

Method has too many Body parameters 可能原因

方法内参数不止一个

1、如果是例如:

可以使用@RequestParam注解:

2、使用对象:

 

解决办法有两个:

1、使用注解@SpringQueryMap

2、把这两个对象整合为一个,例如把User中相关属性写到PageRequest中,保证只有一个对象。

Method metrics not annotated with HTTP method type (ex. GET, POST)

可能原因:接口处有方法没有添加和@GetMapping功能类似的注解,即便具体业务没有做,也要加上,否则导入的服务无法启动。

调用接口得到了莫名其妙的结果

可能原因:由于现在大多数采用resultful风格接口,而默认的feign使用GET请求调用接口,目标接口是使用对象接收时,会转为POST请求,你会看到日志里接口由GET自动变为了POST。

解决办法:

1、改为POST请求,如果接口是别人提供的就无法使用,因为可能别人服务已经联调好了,再去改很麻烦,加上别人很忙,可能也不会回头来给你改。

2、目标接口参数加上@SpringQueryMap,不过有可能像我在协同开发的时候,服务是别人的,无法改变别人的服务,那么只能换其它方式了。

3、本服务加上这两个依赖

<!-- httpclient -->
<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.9</version>
</dependency>
<!-- feign-httpclient -->
<dependency>
    <groupId>io.github.openfeign</groupId>
    <artifactId>feign-httpclient</artifactId>
  <version>10.2.3</version>
</dependency>

4、像我们项目,本来我使用第3种方法解决,可能我们组长说我为什么导入这两个依赖,我解释之后,他新写了一个POST接口用于调用,所以最后究竟选择什么办法,还是看你们组长决定,哈哈。

5、再说一下,其实你自己无法改变别人的接口参数,你可以写一个一样的,只要请求地址正确,完全可以使用,例如他死活不愿意加注解,你可以在自己的新建的接口加上任意注解参数,也是可以使用的,但是极其不推荐,弊端很多,但是可以用于测试,最后还是去沟通一下,找组长。再说一遍:别这么干。

SpringCloud之Feign调用400错误问题

项目在本地环境一直在正常运行,突然测试环境大量报错,点哪错哪.

项目报错的接口是 A服务通过feign调用B服务,但是会通过两个接口调用两次B服务

查看测试环境日志发现错误如下:

这里只展示主要异常信息

feign.FeignException: status 400 reading

一开始我们被这个400的错误码误导了,一直查参数问题,但是换了所有参数后,还是报这个错,总之网上的解决办法能找的都找了.什么参数不对,序列化不对,参数过大,返回值过大,豪猪超时.甚至是服务器重启都试过,还是没能解决问题

最后的最后,直接上干货,如果上述方法你都试过,但是还是没能解决的话,那么你可能是跟我一样的问题.

直接贴干货代码:

@RequestMapping(value ="/api/getBeingProject",headers = {"Connection=close"})
List<SysProject> getBeingProject(@RequestParam String entId);

上述是自定义client中的一个远程方法,在方法上加入关键的

headers = {"Connection=close"}

这代表这次调用后,会立马关闭回收连接.

结论:

通过公司几位大佬各种跟源码分析,情况可能是这样的,

两次调用都会从连接池去拿连接

有可能是第一次调用的连接需要2秒钟

但是1秒就执行完毕了,然后第二次连接就过来了

直接拿了第一次剩下的连接去用

然后就直接把本次连接拒绝掉

feign就会报400错误,在方法上加这个headers后

本次调用后,会立马回收关闭连接,不给其他人拿到这次连接的机会,就解决了问题

彩蛋:

所有环境都没问题后,发布线上,发现线上还是会有一个接口还出现同样的问题.最后发现是这个接口请求的数据有点大,然后分批次去请求就解决了问题。 

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • java并发等待条件的实现原理详解

    java并发等待条件的实现原理详解

    这篇文章主要介绍了java并发等待条件的实现原理详解,还是比较不错的,这里分享给大家,供需要的朋友参考。
    2017-11-11
  • mybatis plus的3种查询方式(小结)

    mybatis plus的3种查询方式(小结)

    这篇文章主要介绍了mybatis plus的3种查询方式(小结),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • Set接口深入剖析之HashSet、LinkedHashSet和TreeSet

    Set接口深入剖析之HashSet、LinkedHashSet和TreeSet

    这篇文章主要介绍了Set接口深入剖析之HashSet、LinkedHashSet和TreeSet,LinkedHashSet是HashSet的子类,实现了Set接口,LinkedHashSet底层是一个LinkedHashMap,底层维护了一个数组+双向链表,需要的朋友可以参考下
    2023-09-09
  • MyBatis中防止SQL注入讲解

    MyBatis中防止SQL注入讲解

    这篇文章主要介绍了MyBatis中防止SQL注入,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2021-12-12
  • Spring如何将配置文件中的简单值注入Bean中

    Spring如何将配置文件中的简单值注入Bean中

    Spring 提供了几种优雅的方式来将配置文件中的简单值(如字符串、数字、布尔值等)注入到 Bean 中,下面小编就为大家介绍一下两种主流的方法吧
    2025-07-07
  • Java 动态代理深入理解

    Java 动态代理深入理解

    这篇文章主要介绍了Java 动态代理深入理解的相关资料,需要的朋友可以参考下
    2017-03-03
  • Java轻松批量替换Word文档文字内容的操作步骤

    Java轻松批量替换Word文档文字内容的操作步骤

    Word 文档常用于撰写报告、合同、通知、技术文档等,当文档内容较多时,如果需要修改或替换某些词语、短语,甚至是格式化文本,手动操作往往效率很低,所以本文给大家介绍了Java实现轻松批量替换Word文档文字内容,需要的朋友可以参考下
    2025-09-09
  • 2023最新版本idea用maven新建web项目(亲测不报错)

    2023最新版本idea用maven新建web项目(亲测不报错)

    这篇文章主要给大家介绍了关于2023最新版本idea用maven新建web项目,Maven是当今Java开发中主流的依赖管理工具,文中介绍的步骤亲测不报错,需要的朋友可以参考下
    2023-07-07
  • SpringBoot+Shiro学习之密码加密和登录失败次数限制示例

    SpringBoot+Shiro学习之密码加密和登录失败次数限制示例

    本篇文章主要介绍了SpringBoot+Shiro学习之密码加密和登录失败次数限制示例,可以限制登陆次数,有兴趣的同学可以了解一下。
    2017-03-03
  • SpringBoot配置LocalDateTime格式化方式

    SpringBoot配置LocalDateTime格式化方式

    文章主要介绍了Spring Boot中处理日期格式化和反格式化的方法,包括配置Jackson的`@JsonFormat`注解和全局配置日期转换器`LocalDateTimeConvert`,以及`ConversionService`中`convert`的添加时机和过程
    2026-01-01

最新评论