3

JAX-WS APIを使用して、WS-Addressing対応のWebサービスクライアントを作成したいと思います。wsimportを使用してWSDLファイルからクライアントスタブを作成し、AddressingFeatureを使用してWS-Addressingを有効/無効にできます。

Hello hello = service.getHelloSoap11(new AddressingFeature(true, true));

ただし、WS-Addressing ReplyTo/FaultToエンドポイント参照をカスタマイズするサンプルがWebで見つかりません。基本的に、次のようなWSリクエストを作成します(wsa:ReplyTo要素を参照)。

<soapenv:Envelope ...>
  <soapenv:Header xmlns:wsa="http://www.w3.org/2005/08/addressing">
    <wsa:To soapenv:mustUnderstand="1">http://localhost:8080/poc/helloService/
    </wsa:To>
    <wsa:ReplyTo>
      <wsa:Address>http://mycompany.com/poc/reply</wsa:Address>
      <wsa:ReferenceParameters>
        <field1 xmlns="http://mycompany.com/poc/cust">some value1</field1>
        <field2 xmlns="http://mycompany.com/poc/cust">some value2</field2>
      </wsa:ReferenceParameters>
    </wsa:ReplyTo>
    <wsa:Action>http://mycompany.com/poc/sayHello</wsa:Action>
    <wsa:MessageID>urn:uuid:7849b04f-c74e-4836-99e4-8e25d2700fae
    </wsa:MessageID>
  </soapenv:Header>
  <soapenv:Body>
    ...
  </soapenv:Body>
</soapenv:Envelope>

Spring Web Serviceクライアントを使用している場合は、エンドポイント参照を追加できます。ただし、JAX-WSを使用して行う必要があります。何か案は?

4

2 に答える 2

1

私は自分の質問に答えます。

標準のJAX-WSAPIは、WS-Addressing From / ReplyTo/FaultToエンドポイント参照をカスタマイズする便利な方法を提供していないようです。ただし、各JAX-WSランタイムは、ヘッダーを設定するための追加の独自のAPIを提供する場合があります。

たとえば、IBM JAX-WS RIは、エンドポイント参照を作成するためのEndpointReferenceManagerSPIを提供します。

    import com.ibm.wsspi.wsaddressing.EndpointReference;
    import com.ibm.wsspi.wsaddressing.EndpointReferenceManager;
    import com.ibm.wsspi.wsaddressing.WSAConstants;

    public void testWSAddressing () {

    // get the port
    Hello hello = service.getHelloSoap11();

    // build a EndpiontReference of <wsa:ReplyTo>
    BindingProvider bp = (BindingProvider) hello;
    EndpointReference epr = EndpointReferenceManager.createEndpointReference(new URI(
       "http://www.w3.org/2005/08/addressing/anonymous"));
    epr.setReferenceParameter(new QName("http://mycompany.com/test", "someRefParam"),
                "12345678");

    ((BindingProvider) hello).getRequestContext()
            .put(WSAConstants.WSADDRESSING_REPLYTO_EPR, epr);
    ...

    HelloResponse response = hello.hello(request);
    }

上記のコードをIBMWebsphere内で実行すると、次のようなSOAPメッセージが生成されます。

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
  <soapenv:Header xmlns:wsa="http://www.w3.org/2005/08/addressing">
    <wsa:To>http://localhost:8080/poc/helloService/</wsa:To>
    <wsa:ReplyTo>
      <wsa:Address>http://www.w3.org/2005/08/addressing/anonymous
      </wsa:Address>
      <wsa:ReferenceParameters>
        <someRefParam xmlns="http://mycompany.com/test">12345678</someRefParam>
      </wsa:ReferenceParameters>
    </wsa:ReplyTo>
    <wsa:MessageID>urn:uuid:BE9E173A35BAB51CB31338454394298
    </wsa:MessageID>
    <wsa:Action>http://mycompany.com/Hello</wsa:Action>
  </soapenv:Header>
  <soapenv:Body>
    ...
  </soapenv:Body>
</soapenv:Envelope >
于 2012-07-25T06:34:24.797 に答える
1

標準のJAX-WSでこれを行う方法を見つけました。ポートを取得するときは、AddressingFeatureとOneWayFeatureの両方を使用してください。

AddressingFeature addressingfeature = new AddressingFeature();
OneWayFeature onewayfeature = new OneWayFeature(true, new WSEndpointReference(YOUR_REPLY_TO_ADDRESS, AddressingVersion.W3C));

// get the port
Hello hello = service.getHelloSoap11(addressingfeature, onewayfeature);

これにより、「ReplyTo」タグ付きのメッセージが生成されます。これには、「com.sun.xml.ws:jaxws-rt」依存関係を取得する必要がある場合があります。

于 2014-07-15T13:02:26.600 に答える