我想让当前请求对子线程可用,而不是将原始请求作为方法参数通过多个层传递。该应用程序既可以作为 servlet 也可以作为 portlet 运行。
通常,DispatcherServlet 和 DispatcherPortlet 将当前请求设置为当前线程上的 RequestContextHolder。这样,调用线程就可以访问当前请求。请求不会传播到子线程。
在我的例子中,请求产生了一个子线程,它使用 RestTemplate 进行 ReST 调用,我需要访问拦截 RestTemplate 的 ClientHttpRequestInterceptor 中的原始请求。传递给拦截的请求没有用,我需要到达服务器的原始请求。
DispatcherServlet 和 DispatcherPortlet 都具有将 RequestContext 传递给子线程的特性:setThreadContextInheritable(true)。但是,将该标志设置为 true 似乎并不容易。没有设置它的 init-param,通常您在 web.xml 或 portlet.xml 中指定它们。
有没有办法通过他们的设置器使用 xml 配置来自定义调度程序 portlet 或 servlet?我发现的唯一方法是编写一个自定义 dispatcherservlet/portlet,它在内部将标志设置为 true,并在 web.xml 和 portlet.xml 中使用它。