今天遇到一个问题,项目中使用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));
}
}
}
}
这是:测试接口:
这是调用api: