1

元のリクエストをいくつかのレイヤーを介してメソッドパラメーターとして渡すことなく、現在のリクエストを子スレッドで利用できるようにしたいと考えています。アプリケーションは、サーブレットとポートレットの両方として実行されます。

通常、DispatcherServlet と DispatcherPortlet は、現在のリクエストを現在のスレッドの RequestContextHolder に設定します。このようにして、呼び出しスレッドは現在の要求にアクセスできます。要求は子スレッドに伝搬されません。

私の場合、リクエストは、RestTemplate を使用して ReST 呼び出しを行うサブスレッドを生成し、RestTemplate をインターセプトする ClientHttpRequestInterceptor で元のリクエストにアクセスする必要があります。インターセプトに渡されるリクエストは役に立ちません。サーバーにヒットした元のリクエストが必要です。

DispatcherServlet と DispatcherPortlet の両方に、RequestContext を子スレッドに渡す機能があります: setThreadContextInheritable(true)。ただし、そのフラグを true に設定するのはそれほど簡単ではないようです。それを設定する init-param はなく、通常は web.xml または portlet.xml で指定します。

xml 構成を使用してセッターを介してディスパッチャー ポートレットまたはサーブレットをカスタマイズする方法はありますか? 私が見つけた唯一の方法は、フラグを内部的に true に設定するカスタムのディスパッチャーサーブレット/ポートレットを作成し、それを web.xml および portlet.xml で使用することです。

4

1 に答える 1

3

XML 構成を介して直接これを行う方法はありません。あなたが言ったようにして、DispatcherServlet内部的に呼び出すサブクラスを作成する必要がありますsetThreadContextInheritable(true)

ServletContextもう 1 つの方法は、Java で構成を実行することです。Spring は、カスタマイズされた(他のサーブレットとフィルター)WebApplicationInitializerを登録できる便利なサブタイプを多数提供します。DispatcherServlet

インスタンスを作成します。

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

そしてそれを登録します

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