2

アプリケーション サーバー (Websphere Application Server 7.0) で実行される Web サービス (JAX-RPC) があります。通常、開発プロセスは次のようになります。

  • Web サービスの実装 (MyService.java など) を使用してクラスを作成します。
  • IDE は、Web サービス エンドポイント インターフェイス (MyService_SEI.java など) を生成します。
  • IDE が構成 XML を生成する

Web サービスがデプロイされると、MyService_SEI は宣言されたサービス インターフェイスであり、アプリケーション サーバーは引数なしのパブリック コンストラクターを使用して MyService インスタンスをインスタンス化します。

しかし、コンストラクター インジェクションを実行したい場合 (つまり、引数のないコンストラクターのない MyService クラスを持っている場合)、または MyService_SEI を実装してそれを使用する動的プロキシ オブジェクトを提供したい場合はどうすればよいでしょうか?

これを実現するために、インスタンス化手順 (フィルターやインターセプターなど) を制御する方法はありますか?

4

2 に答える 2

2

インジェクションは常にデフォルトのコンストラクターが呼び出された後に発生するため、コンストラクターのインジェクションを行うことはできません。デフォルトのコンストラクター内で注入された参照を使用しようとすると、常に失敗します。これは仕様で義務付けられているため、これに対する回避策はありません。したがって、あなたが言及した最初のオプションは破棄されます。

フィルターまたはインターセプターを使用する 2 番目のオプションについては、実際にはオプションがあります。WebSphere WebServices は Axis2 実装を使用して構築され、Axis は Handlers を実装する方法を提供します

ハンドラーを JAX-WS ランタイム環境に追加して、要求および応答メッセージの追加処理を実行できます。

Axis のドキュメントからのハンドラーの例を次に示します。

package org.apache.samples.handlersample;

import java.util.Set;

import javax.xml.namespace.QName;
import javax.xml.ws.handler.MessageContext;
import javax.xml.ws.handler.soap.SOAPMessageContext;

public class SampleProtocolHandler implements
       javax.xml.ws.handler.soap.SOAPHandler<SOAPMessageContext> {

   public void close(MessageContext messagecontext) {
   }

   public Set<QName> getHeaders() {
       return null;
   }

   public boolean handleFault(SOAPMessageContext messagecontext) {
       return true;
   }

   public boolean handleMessage(SOAPMessageContext messagecontext) {
       Boolean outbound = (Boolean) messagecontext.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
       if (outbound) {
           // Include your steps for the outbound flow.
       }
       return true;
   }

}

そして、次のように handler.xml ファイルを追加します。

 <?xml version="1.0" encoding="UTF-8"?>

    <jws:handler-chain name="MyHandlerChain">
            <jws:protocol-bindings>##SOAP11_HTTP ##ANOTHER_BINDING</jws:protocol-bindings>
            <jws:port-name-pattern 
             xmlns:ns1="http://handlersample.samples.apache.org/">ns1:MySampl*</jws:port-name-pattern>
       <jws:service-name-pattern 
             xmlns:ns1="http://handlersample.samples.apache.org/">ns1:*</jws:service-name-pattern>
            <jws:handler>
                    <jws:handler-class>org.apache.samples.handlersample.SampleLogicalHandler</jws:handler-class>
            </jws:handler>
            <jws:handler>
                    <jws:handler-class>org.apache.samples.handlersample.SampleProtocolHandler2</jws:handler-class>
            </jws:handler>
            <jws:handler>
                    <jws:handler-class>org.apache.samples.handlersample.SampleLogicalHandler</jws:handler-class>
            </jws:handler>
            <jws:handler>
                    <jws:handler-class>org.apache.samples.handlersample.SampleProtocolHandler2</jws:handler-class>
            </jws:handler>
    </jws:handler-chain>

于 2013-04-05T13:48:21.400 に答える