私はトップダウンアプローチを使用してWebサービスに取り組んでおり、JAX-WSのwsimportを使用してWSDLからサービスタイプとインターフェイスを生成しています。これにより、次のようなポートタイプのインターフェイスが提供されます。これを実装します。
/**
* This class was generated by the JAX-WS RI.
* JAX-WS RI 2.2.4-b01
* Generated source version: 2.2
*/
@WebService(name = "ExamplePortType", targetNamespace = "http://example.com")
public interface ExamplePortType {
/**
* @param example
* @return java.lang.String
* @throws ExampleException
*/
@WebMethod
@WebResult(name = "exampleResponse", targetNamespace = "http://example.com")
@RequestWrapper(localName = "sendExample", targetNamespace = "http://example.com", className = "com.example.SendExample")
@ResponseWrapper(localName = "sendExampleResponse", targetNamespace = "http://example.com", className = "com.example.SendExampleResponse")
public String sendExample(
@WebParam(name = "example", targetNamespace = "http://example.com")
ExampleRequest example)
throws ExampleException
;
}
このサービスをアプリケーションサーバー(私の場合はTomcat)に追加する通常の方法は、実装クラスをサーブレットとしてweb.xmlに追加し、リスナーとしてWSServletContextListenerを追加することです。非常に大まかに言えば、コンテキストの初期化時に、リスナーは実装BeanをラップするServletAdaptersを構築し、それらをシンWSServletによって呼び出されるWSServletDelegateに追加するようです。実装へのリクエストはWSServletによって処理され、設定したURLパターンに基づいてデリゲートによってBeanに渡されます。
上記をプログラムで行う方法はありますか?上記のインターフェースのインスタンスを受け入れ、サーブレットのインスタンスを返すメソッドが必要です。サーブレットコンテキストに登録されている場合は、適切なリクエストをラップされた実装にルーティングします。何かのようなもの:
Servlet exampleServlet = new ServletAdapter().wrap(new ExamplePortTypeImpl());
1つの要件は、静的構成ファイル(web.xmlやsun-jaxws.xmlなど)に依存できないことです。JAX-WSまたは関連ライブラリ(つまり、Axis2など)はこの種の機能を提供しますか?
何かが明確でない場合はお詫びします。ここは初めてです:)。どんなポインタでも大歓迎です。
現在、JAX-WS 2.1、Tomcat 7、サーブレット3.0を使用しています。