JAX-WS Web サービス内から ApplicationContext にアクセスするにはどうすればよいですか?
-
03-07-2019 - |
質問
に似ている JAX-WS Web サービス内から ServletContext にアクセスするにはどうすればよいですか?, 、これより簡単に applicationContext にアクセスする方法はありますか?
import javax.annotation.Resource;
import javax.jws.WebService;
import javax.servlet.ServletContext;
import javax.xml.ws.WebServiceContext;
import javax.xml.ws.handler.MessageContext;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
@WebService
public class MyWebService {
// boilerplate code begins :(
@Resource
private WebServiceContext context;
private WebApplicationContext webApplicationContext = null;
/**
* @return
* @throws IllegalStateException
*/
private WebApplicationContext getWebApplicationContext()
throws IllegalStateException {
if (webApplicationContext != null)
return webApplicationContext;
ServletContext servletContext =
(ServletContext) context.getMessageContext().get(
MessageContext.SERVLET_CONTEXT);
webApplicationContext =
WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);
return webApplicationContext;
}
}
解決
Web サービスが Web コンテキストやサーブレット コンテキスト、あるいはそのアプリケーション コンテキストについて知る必要はないと思います。なぜそれを知る必要があるのかわかりません。もっと受動的になるべきではないでしょうか?必要なものを注入し、動作させます。クライアントとのサービスのやり取りは、事前に定義された契約に基づく必要があります。何らかのコンテキストから未知の値を取得する必要がある場合、クライアントは何を設定する必要があるのか、またはその設定方法をどのようにして知るのでしょうか?
私はさらに踏み込んで、Web サービスは Spring サービス インターフェイスのラッパーであるべきだと言います。それは、暴露するためのあらゆる可能な方法の中の 1 つの選択肢にすぎません。Web サービスは、XML リクエスト/レスポンス オブジェクトのマーシャリングとアンマーシャリングを行い、Spring サービスと連携するだけで十分です。
他のヒント
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.web.context.support.SpringBeanAutowiringSupport;
@WebService(
endpointInterface = "Bla",
targetNamespace = "http://bla/v001",
wsdlLocation = "WEB-INF/wsdl/bla.wsdl",
serviceName = "BlaService",
portName = "BlaPort")
public class BlaWs extends SpringBeanAutowiringSupport implements BlaPort {
@Autowired
@Qualifier("dao")
private Dao dao;
...
}
WebサービスBeanでSpring Beanを拡張します。
like これ
ThreadLocalにチェーンする前にServletContextを保存するフィルターをインストールします
SpringBeanAutowiringSupportクラスのJavaDocによると、以下を参照してください。 http ://docs.spring.io/autorepo/docs/spring-framework/3.0.x/api/org/springframework/web/context/support/SpringBeanAutowiringSupport.html
注を読む:javadocの最後。
実際には、元の質問は、これを実装する方法である可能性があります。