java - 如何在 Spring 的 dispatcherportlet 和 dispatcherservlet 上通过 xml 设置 ThreadContextInheritable(true)

标签 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 中使用它。

最佳答案

没有办法直接通过 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/

相关文章:

java - Spring mvc 4 hello world 示例抛出 javax.servlet.ServletException : Failed to instantiate WebApplicationInitializer class

java - 两个输出流?

java - 如何从 Java 源代码生成 AST?

java - 如何在定制的 AOP 顾问程序中获取 HttpServletRequest?

java - 为什么在对 Controller 类进行单元测试时使用 Spring Mockmvc

java - ResponseEntity<T> 和@ResponseBody 有什么区别?

java - 如何最好地为 Android MVC 应用程序实现一个内聚的模型层?

java - 写入现有的 Excel 文件

java - Spring 依赖注入(inject)到匿名实现中

java - Spring Security : SecurityContextHolder. getContext().getAuthentication() 在用户注册用户并重定向到登录后页面后返回 null