【问题标题】:How to setThreadContextInheritable(true) via xml on Spring's dispatcherportlet and dispatcherservlet如何在 Spring 的 dispatcherportlet 和 dispatcherservlet 上通过 xml 设置ThreadContextInheritable(true)
【发布时间】:2014-09-09 14:17:11
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • DispatcherPortlet 也可以进行 Java 配置吗?
    猜你喜欢
    • 2013-05-18
    • 1970-01-01
    • 1970-01-01
    • 2018-02-09
    • 1970-01-01
    • 1970-01-01
    • 2021-04-14
    • 2016-04-20
    • 2016-09-12
    相关资源
    最近更新 更多