SpirngBoot集成zipkin\sleuth踩坑

本文档介绍了在SpringBoot应用中,由于Sleuth导致的Feign调用时HttpMediaTypeNotSupportedException问题。问题源于请求头被错误地复用。解决方案是通过配置自定义拦截器移除不正确的Content-Type请求头。详细代码示例展示了如何通过反射操作修复此问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题

导入文件接口报错
web请求A服务调用B服务

B服务报错如下:

org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'multipart/form-data;boundary=--------------------------473858664983319617284770;charset=UTF-8' not supported
	at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver.readWithMessageConverters(AbstractMessageConverterMethodArgumentResolver.java:237)
	at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.readWithMessageConverters(RequestResponseBodyMethodProcessor.java:150)
	at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.resolveArgument(RequestResponseBodyMethodProcessor.java:128)
	at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121)
	at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:158)
	at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:128)
	at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:97)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738)
	at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:967)
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901)
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
	at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872)

排查

环境:springboot版本1.x sleuth版本1.x
通过调试发现sleuth复用上一个请求头内容调用下一链路服务报错

解决

去除feign调用中错误请求头


@Configuration
public class ClientConfiguration {
    @Bean
    public RequestInterceptor headerInterceptor() {
        return new RequestInterceptor() {
            @Override
            public void apply(RequestTemplate template) {
                HttpServletRequest httpServletRequest = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
                if (httpServletRequest.getRequestURI().contains(template.url())) {
                    try {
                        Field connectorField = ReflectionUtils.findField(SecurityContextHolderAwareRequestWrapper.class, "request");
                        connectorField.setAccessible(true);
                        FirewalledRequest firewalledRequest = (FirewalledRequest) connectorField.get(httpServletRequest);
                        if(Objects.isNull(firewalledRequest))
                            return;

                        Field firewalledField = ReflectionUtils.findField(FirewalledRequest.class, "request");
                        firewalledField.setAccessible(true);
                        RequestFacade requestFacade = (RequestFacade) firewalledField.get(firewalledRequest);
                        if(Objects.isNull(requestFacade))
                            return;

                        connectorField = ReflectionUtils.findField(RequestFacade.class, "request");
                        firewalledField.setAccessible(true);
                        Request connectorRequest = (Request) connectorField.get(requestFacade);
                        if(Objects.isNull(connectorRequest))
                            return;

                        Field coyoteField = ReflectionUtils.findField(Request.class, "coyoteRequest", org.apache.coyote.Request.class);
                        coyoteField.setAccessible(true);
                        org.apache.coyote.Request coyoteRequest = (org.apache.coyote.Request) coyoteField.get(connectorRequest);
                        if(Objects.isNull(coyoteRequest))
                            return;

                        Field mimeHeadersField = ReflectionUtils.findField(org.apache.coyote.Request.class, "headers", MimeHeaders.class);
                        mimeHeadersField.setAccessible(true);
                        MimeHeaders mimeHeaders = (MimeHeaders) mimeHeadersField.get(coyoteRequest);
                        mineHeadersHandle(mimeHeaders);
                    } catch (IllegalAccessException e) {
                        e.printStackTrace();
                    }
            }
        };
    }

    protected static void mineHeadersHandle(MimeHeaders mimeHeaders) {
        mimeHeaders.removeHeader(HttpHeaders.CONTENT_TYPE);

    }
}


上面代码为小丑局 优化后链接
https://blog.csdn.net/qq_35764295/article/details/123581222

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三省同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值