解决openfeign调用时content-type的问题

 更新时间:2026年01月13日 09:31:09   作者:哈哈哈哈哈基米  
文章主要描述了在使用OpenFeign调用其他服务时遇到的偶发性报错问题,问题原因在于请求头中Content-Type的不一致,通过修改OpenFeign的配置类或调整服务引用的配置类数量,解决了这个问题,同时,还讨论了当B服务接口也是文件上传接口时的解决方案

问题1描述

今天在A服务使用openfeign调用B服务的时候,发现经常会偶发性报错。

错误如下:

情况为偶发,很让人头疼。

两个接口如下: 

A服务接口:

delayReasonApi.test(student);就是使用openfeign调用B服务的接口。 

B服务接口:

原因分析

因为A服务的接口是一个文件上传的接口,所以前端请求头中使用的是multipart/form-data 来请求的该接口。而B服务的接口是一个用json接口参数的接口,所以需要请求头中的Content-Type为application/json。

如果在上面都没有配置过的情况下,在B服务的接口参数使用@RequestBody注解来接受的时候,openfeign是会默认使用application/json 的content-type来进行请求的。

代码如下:

但是一般我们都会在项目中加上openfeign的配置文件,将目前的所有的header中的参数全部写入openfeign的请求中,如下:

@Component
public class FeignConfiguration implements RequestInterceptor {

    @Override
    public void apply(RequestTemplate template) {
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder
                .getRequestAttributes();
        if (attributes != null) {
            HttpServletRequest request = Objects.requireNonNull(attributes).getRequest();
            Enumeration<String> headerNames = request.getHeaderNames();
            if (headerNames != null) {
                while (headerNames.hasMoreElements()) {
                    String name = headerNames.nextElement();
                    String values = request.getHeader(name);
                    template.header(name, values);
                }
            }
        }
    }
}

这样就导致,我A服务接口使用的是multipart/form-data,而B服务接口需要的是application/json,而我的配置类会把A接口的multipart/form-data写到请求头中,这样就会导致openfeign在请求的时候会有两个content-Type,而且这两个值的顺序是不一定的,有的时候application/json在前面,有的时候multipart/form-data在前面:

我估计B服务在拿的时候只那集合中的第一个,但是我没找源码嘿嘿。当multipart/form-data在前面的时候,就会报上面的错误。

所以这个时候就有一个解决办法

把我们的配置类中的代码进行修改,跳过content-type的赋值。

如此,openfeign就只会用默认的application/json进行请求了。

问题2描述

延续上面的问题,当我修改了配置类之后,发现还是会有这样的情况,后来发现是我们的微服务的项目中有两个服务都写了openfeign的配置类,而这两个配置类都被引用在了A服务中。

openfeign在调用接口的时候会先迭代所有的配置类,导致前面的情况又重演了一遍。

解决方法

删掉一个配置类。

问题3

继续上面的情况,如果B服务的接口也是个文件上传接口,那么这个时候也是需要使用multipart/form-data的,那这个时候需要怎么做呢?openfeign是否会默认使用multipart/form-data呢? 

B接口如下:

测试结果

content-type为空,并且会报错

解决办法

在B接口上加上 consumes = “multipart/form-data”

此时content-type就有值了。

end!!!

总结

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

相关文章

  • 手把手教你JAVA进制之间的转换

    手把手教你JAVA进制之间的转换

    这篇文章主要介绍了Java实现的进制转换,结合完整实例形式分析了Java实现二进制、十六进制、字符串、数组等相关转换操作技巧,需要的朋友可以参考下
    2021-08-08
  • 浅析Java中的WeakHashMap

    浅析Java中的WeakHashMap

    这篇文章主要介绍了浅析Java中的WeakHashMap,WeakHashMap其实和HashMap大多数行为是一样的,只是WeakHashMap不会阻止GC回收key对象,那么WeakHashMap是怎么做到的呢,这就是我们研究的主要问题,需要的朋友可以参考下
    2023-09-09
  • java短信验证码获取次数限制实例

    java短信验证码获取次数限制实例

    这篇文章主要介绍了java短信验证码获取次数限制实例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-01-01
  • Java线程安全的计数器简单实现代码示例

    Java线程安全的计数器简单实现代码示例

    这篇文章主要介绍了Java线程安全的计数器简单实现代码示例,具有一定参考价值,需要的朋友可以了解下。
    2017-10-10
  • Java实现PDF转为线性PDF详解

    Java实现PDF转为线性PDF详解

    线性化PDF文件是PDF文件的一种特殊格式,可以通过Internet更快地进行查看。本文将通过后端Java程序实现将PDF文件转为线性化PDF。感兴趣的可以了解一下
    2021-12-12
  • Java语法基础之函数的使用说明

    Java语法基础之函数的使用说明

    函数就是定义在类中的具有特定功能的一段小程序,函数也称为方法
    2013-07-07
  • Java中数学相关类的使用教程

    Java中数学相关类的使用教程

    Java是一种广泛使用的编程语言,它提供了许多数学运算的函数和方法,使得开发者可以轻松地进行各种数学计算,下面这篇文章主要给大家介绍了关于Java中数学相关类使用的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-05-05
  • springboot项目中使用Swagger的简单示例

    springboot项目中使用Swagger的简单示例

    大趋势下目前很多的项目都采用了前后端分离的方式进行开发,最近我接触到的项目大多数都是采用了前后端分离的方式进行开发,下面这篇文章主要给大家介绍了关于springboot项目中使用Swagger的简单示例,需要的朋友可以参考下
    2023-04-04
  • Spring Cloud详细讲解zuul集成Eureka流程

    Spring Cloud详细讲解zuul集成Eureka流程

    这篇文章主要介绍了Spring Cloud zuul集成Eureka,Eureka Client中内置一个负载均衡器,用来进行基本的负载均衡,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • Java bat批处理命令启动jar包的操作方法

    Java bat批处理命令启动jar包的操作方法

    这篇文章主要介绍了JAVA bat批处理命令启动jar包,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2024-12-12

最新评论