我有两个弹簧启动服务。A和B。
从服务中,我正在调用B服务(使用Feign Client(。我有一个请求拦截器,在发送请求之前将自定义标头添加到该请求中。
这是我的拦截器:
public class HeaderInterceptor implements RequestInterceptor {
@Override
public void apply(RequestTemplate template) {
try {
Object encrypyedData = RequestContextHolder.currentRequestAttributes().getAttribute(""headerName", 0);
if(encrypyedData != null) {
template.header("headerName", encrypyedData.toString());
}else {
System.out.println("Encrypted Data is NULL");
}
} catch(Exception e) {
System.out.println("ankit === "+e.getMessage());
}
}
}
但是,当我运行此代码时,我会得到例外:找不到线程的请求:您是指实际Web请求之外的请求属性,还是在最初接收线程之外处理请求?如果您实际上在Web请求中运行并仍会收到此消息,则您的代码可能在dispatcherservlet/dispatcherportlet之外运行:在这种情况下,请使用requestContextListener或requestContextFilter来揭示当前请求。
我还尝试在服务中添加此
@Bean public RequestContextListener requestContextListener(){
return new RequestContextListener();
}
我已将其添加到主应用程序中(用@springbootapplication注释的文件(。
仍然存在同一问题。我想念什么?
可能您正在HyStrix上运行Spring Cloud Feign。HyStrix的默认隔离模式是thread
,因此将在由HyStrix管理的不同线程上调用实际的HTTP请求。 HeaderInterceptor
也在该线程上运行。
但是,您正在访问RequestContextHolder
,并且它正在使用ThreadLocal。这可能是您错误的原因。
尝试在服务上使用以下属性之一。
它将禁用hystrix的假效果。
feign:
hystrix:
enabled: false
或者,您只需更改下面的hystrix的隔离模式。
hystrix:
command:
default:
execution:
isolation:
strategy: SEMAPHORE
如果有效,则需要选择适用的方式。只需禁用Hystrix或更改隔离策略,或者只是通过另一种方式传递属性即可。