2014-09-09 7 views
1

원래 요청을 메소드 매개 변수로 여러 레이어를 통해 전달하지 않고 현재 요청을 하위 스레드에서 사용 가능하게하려고합니다. 응용 프로그램은 서블릿 및 포틀릿으로 실행됩니다.Spring의 dispatcherportlet 및 dispatcherservlet에서 xml을 통해 setThreadContextInheritable (true)를 설정하는 방법

일반적으로 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에서이를 사용하는 사용자 정의 dispatcherservlet/portlet을 작성하는 것입니다.

답변

3

XML 구성을 통해 직접이를 수행 할 방법이 없습니다. 당신이 말했듯이 내부적으로 setThreadContextInheritable(true)을 호출하는 DispatcherServlet의 하위 클래스를 생성해야합니다.

다른 방법으로 Java에서 ServletContext 구성을 수행하는 것입니다. Spring은 WebApplicationInitializer과 많은 유용한 서브 타입을 제공하며 사용자 정의 된 DispatcherServlet (다른 서블릿과 필터)을 등록 할 수 있습니다.

인스턴스를 만들 수 있습니다.

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

다음 자바 설정은, DispatcherPortlet에 가능한도 그것을

ServletRegistration.Dynamic dispatcher = servletContext.addServlet("dispatcher", servlet); 
+0

가 등록? – dschulten

+0

@ds 포틀릿에 대해서는 한번도 다루지 않았습니다. 나는 모른다. –