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