如何在Spring的dispatcherportlet和dispatcherservlet上通过xml setThreadContextInheritable(true)

时间:2014-09-09 14:17:11

标签: java spring spring-mvc spring-portlet-mvc requestcontext

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

1 个答案:

答案 0 :(得分:3)

无法直接通过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);
相关问题