我有两个春季启动服务。 A和B.
从服务中,我正在呼叫B服务(使用Feign客户端)。 我有一个请求拦截器,它会在发送之前为请求添加自定义标头。
这是我的拦截器:
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来公开当前请求。
我也尝试在服务A中添加它
@Bean public RequestContextListener requestContextListener(){
return new RequestContextListener();
}
我已将其添加到主应用程序文件中(使用@SpringBootApplication注释的文件)。
仍然是同一个问题。我错过了什么?
答案 0 :(得分:0)
也许你正在Hystrix上运行你的春云假装。
Hystrix的默认隔离模式为thread
,因此将在由hystrix管理的不同线程上调用实际的HTTP请求。 HeaderInterceptor
也在该线程上运行。
但是,您正在访问RequestContextHolder
并且它正在使用ThreadLocal。这可能是你错误的原因。
尝试在A服务上使用以下某个属性。
它将禁用hystrix for feign。
feign:
hystrix:
enabled: false
或者,您可以像下面一样更改hystrix的隔离模式。
hystrix:
command:
default:
execution:
isolation:
strategy: SEMAPHORE
如果有效,您需要选择适用的方式。只需禁用hystrix或更改隔离策略或只是通过其他方式传递属性。