Springのweb.xmlで2つのサーブレットを定義します。1つはアプリケーションのhtml/jspページ用で、もう1つは外部アプリケーションによって呼び出されるWebサービス用です。 web.xmlは次のとおりです。
<servlet>
<servlet-name>myservlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>myservlet</servlet-name>
<url-pattern>*.htm</url-pattern>
</servlet-mapping>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>WEB-INF/user-service-servlet.xml</param-value>
</context-param>
<servlet>
<servlet-name>user-webservice</servlet-name>
<servlet-class>org.Apache.cxf.transport.servlet.CXFServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>user-webservice</servlet-name>
<url-pattern>/UserService/*</url-pattern>
</servlet-mapping>
Myservletでファイル内のDispatcherServletを単独で使用する場合、正常に機能します。設定ファイル(user-service-servlet.xml)のcontext-paramを持つuser-webserviceがある場合、正常に動作します。ただし、ファイルに両方がある場合、myservlet-servlet.xmlファイルが自動的にロードされないため、myservletは機能しません。 context-paramを削除すると、myservletは機能しますが、構成ファイル(user-service-servlet.xml)がロードされないため、user-webserviceは機能しません。
両方のサーブレットを定義し、両方の構成ファイルをロードするにはどうすればよいですか?
Cxf-userメーリングリストの このスレッド で説明されているように、CXFServletにuser-webservice-servlet.xml
から独自のスプリングコンテキストをロードさせるのではなく、ロット全体をルートコンテキストにロードできます。既存のuser-webservice-servlet.xml
の名前を他の名前(たとえばuser-webservice-beans.xml
)に変更し、contextConfigLocation
パラメーターを次のように変更します。
<servlet>
<servlet-name>myservlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>myservlet</servlet-name>
<url-pattern>*.htm</url-pattern>
</servlet-mapping>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/applicationContext.xml
/WEB-INF/user-webservice-beans.xml
</param-value>
</context-param>
<servlet>
<servlet-name>user-webservice</servlet-name>
<servlet-class>org.Apache.cxf.transport.servlet.CXFServlet</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>user-webservice</servlet-name>
<url-pattern>/UserService/*</url-pattern>
</servlet-mapping>
次のような構成を使用します。
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>myservlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet>
<servlet-name>user-webservice</servlet-name>
<servlet-class>org.Apache.cxf.transport.servlet.CXFServlet</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
次に、3つのファイルが必要になります。
*-servlet.xml
ファイルは自動的に使用され、それぞれがそのサーブレットのアプリケーションコンテキストを作成します。
Springのドキュメントから 13.2。DispatcherServlet :
フレームワークは、
DispatcherServlet
の初期化時に、WEB-INF
で[servlet-name] -servlet.xmlという名前のファイルを探します。 Webアプリケーションのディレクトリを作成し、そこで定義されたBeanを作成します(グローバルスコープで同じ名前で定義されたBeanの定義をオーバーライドします)。
私はこれが少し古いことを知っていますが、要するに答えは<load-on-startup>です。これにより、ロードシーケンスが混乱する可能性があります。