上記のクラスに関していくつかの統合の問題がありますが、「新しすぎる」Tomcat バージョンのみです。
基本セットアップ: web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="FooService" version="2.5" metadata-complete="true">
<display-name>FooService</display-name>
<servlet>
<servlet-name>jax-ws</servlet-name>
<servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:/applicationContext.xml
</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<listener>
<listener-class>com.sun.xml.ws.transport.http.servlet.WSServletContextListener</listener-class>
</listener>
</web-app>
FooServiceImpl:
@WebService(serviceName = ServiceInfo.SERVICENAME, targetNamespace = ServiceInfo.TARGETNAMESPACE, endpointInterface = "bar.FooService")
@HandlerChain(file = "/handler-chain.xml")
public class FooServiceImpl extends SpringBeanAutowiringSupport implements FooService {
@Autowired
private Bar bar;
<< some methods using the injected bar singleton >>
JAX-WS 依存関係: 'com.sun.xml.ws:jaxws-rt:2.2.7' をコンパイル Spring バージョン: 3.1.2.RELEASE
Tomcat 7.0.22 では問題はありません。web.xml で宣言されている webapp のバージョンは 2.5 です。Tomcat 7.0.22 は WSServletContainerInitializer を処理しません。したがって、web.xml で宣言されているように、ContextLoaderListener が最初に初期化されるため、Bar のインスタンスが WebApplicationContext で使用可能になります。次に、WSServletContextListener が FooServiceImpl をインスタンス化し、自動配線が機能して、誰もが満足します。
しかし...同僚がTomcat 7.0.30で試してみましたが、自動配線は機能しませんでした(7.0.32でも同じ問題が発生し、現在これが最新です)。新しいTomcatバージョンは2.5 webappバージョン(およびmetadata-complete="true")を考慮せずにWSServletContainerInitializerを処理したため、実際には機能しませんでした。
私は可能な解決策を見つけました。web.xml の本文をコメントアウトし、webapp のバージョンを 3.0 に変更して、WebapplicationInitializer を作成しました。
public class MyInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
ContextLoader loader = new ContextLoader();
loader.initWebApplicationContext(servletContext);
}
}
これは私にとって完璧に機能しました。しかし、同僚にとってはそうではありません... 彼がアプリを実行しようとすると、WSServletContainerInitializer が最初に起動し、上記とまったく同じ配線の問題が発生しました。
明らかに、問題を「ハック」して SpringBeanAutowiringSupport を取り除き、ゲッターや Web メソッド、または同様の方法から Bar を手動で注入できます。しかし、SpringBeanAutowiringSupport の方がはるかに明確であるため、上記の問題に対する適切な解決策があれば使用したいと考えています。
更新: これにより問題が発生します: https://issues.apache.org/bugzilla/show_bug.cgi?id=53619