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