1

我想让当前请求对子线程可用,而不是将原始请求作为方法参数通过多个层传递。该应用程序既可以作为 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 中使用它。

4

1 回答 1

3

没有办法直接通过 XML 配置来做到这一点。你需要按照你说的做,并创建一个DispatcherServlet内部调用的子类setThreadContextInheritable(true)

ServletContext另一种方法是在 Java中执行您的配置。Spring 提供了一个WebApplicationInitializer和许多有用的子类型,您可以在其中注册自定义DispatcherServlet(其他 servlet 和过滤器)。

您将创建您的实例。

DispatcherServlet servlet = new DispatcherServlet(context);
servlet.setThreadContextInheritable(true);

然后注册

ServletRegistration.Dynamic dispatcher = servletContext.addServlet("dispatcher", servlet);
于 2014-09-09T14:42:09.690 回答