我想让当前请求对子线程可用,而不是将原始请求作为方法参数通过几层传递。该应用程序既作为 servlet 又作为 portlet 运行。
通常,DispatcherServlet 和 DispatcherPortlet 将当前请求设置为当前线程上的 RequestContextHolder。这样,调用线程就可以访问当前请求。请求不会传播到子线程。
在我的例子中,请求产生了一个子线程,它使用 RestTemplate 进行 ReST 调用,我需要在拦截 RestTemplate 的 ClientHttpRequestInterceptor 中访问原始请求。传递给拦截的请求没有用,我需要命中服务器的原始请求。
DispatcherServlet 和 DispatcherPortlet 都具有将 RequestContext 传递给子线程的功能:setThreadContextInheritable(true)。但是,将该标志设置为 true 似乎并不容易。没有设置它的 init-param,通常您在 web.xml 或 portlet.xml 中指定它们。
有没有一种方法可以使用 xml 配置通过它们的 setter 来自定义调度程序 portlet 或 servlet?我发现的唯一方法是编写一个自定义的 dispatcherservlet/portlet,它在内部将标志设置为 true 并在 web.xml 和 portlet.xml 中使用它。
最佳答案
没有办法直接通过 XML 配置来做到这一点。你需要按照你说的去做,并创建一个 DispatcherServlet
的子类,它在内部调用 setThreadContextInheritable(true)
。
另一种方法是在 Java 中执行您的 ServletContext
配置。 Spring 提供了一个 WebApplicationInitializer
以及许多有用的子类型,您可以在其中注册自定义的 DispatcherServlet
(其他 servlet 和过滤器)。
您将创建您的实例。
DispatcherServlet servlet = new DispatcherServlet(context);
servlet.setThreadContextInheritable(true);
然后注册
ServletRegistration.Dynamic dispatcher = servletContext.addServlet("dispatcher", servlet);
关于java - 如何在 Spring 的 dispatcherportlet 和 dispatcherservlet 上通过 xml 设置 ThreadContextInheritable(true),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25746956/