Feign远程调用401问题

今天遇到一个问题,项目中使用feign拦截请求,但是项目内部两个服务之间进行远程调用的时候,一直报错:
feign.FeignException: status 401 reading WmsApiPlatformService#queryBatch(String)
断点进入的时候发现拦截的attributes是null,个人判断这个问题是线程信息传递的问题,使用:

ServletRequestAttributes requestAttributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
       RequestContextHolder.setRequestAttributes(requestAttributes,true);

就不会报错了,但是这种解决方案很麻烦,不知道有没有更好的解决方案
这是feignconfig代码:

@Configuration
public class FeignConfig implements RequestInterceptor {

    @Override
    public void apply(RequestTemplate requestTemplate) {
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        if(null != attributes) {
            HttpServletRequest request = attributes.getRequest();
            // 检查是否有跳过拦截的标记
            if(request.getHeader("Skip-Interceptor") == null){
                requestTemplate.header(Constants.SERVER_CODE, request.getHeader(Constants.SERVER_CODE));
                requestTemplate.header(Constants.TOKEN, request.getHeader(Constants.TOKEN));
                requestTemplate.header(Constants.INTERFACE, request.getHeader(Constants.INTERFACE));
            }
        }
    }
}

这是:测试接口:

img


这是调用api:

img

【相关推荐】



  • 文章:Feign调用超时时间设置,全局及某一个接口设置超时时间 中也许有你想要的答案,请看下吧
  • 除此之外, 这篇博客: Feign使用步骤详解及实操样例【Feign抽取、Feign继承】中的 4、使用feign-api进行调用 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
    import cn.feign.clients.UserClient;
    import cn.feign.pojo.User;
    import cn.order.mapper.OrderMapper;
    import cn.order.pojo.Order;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    @Service
    public class OrderService {
    
        @Autowired
        private OrderMapper orderMapper;
    
        @Autowired
        private UserClient userClient;
    
        public Order queryOrderById(Long orderId) {
            // 1.查询订单
            Order order = orderMapper.findById(orderId);
            // 2.用Feign远程调用
            User user = userClient.findById(order.getUserId());
            // 3.封装user到Order
            order.setUser(user);
            // 4.返回
            return order;
        }
    }
    

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^