ヘッダーをスキップ
Oracle® Fusion Middleware Oracle WebLogic Server JAX-WS Webサービスの高度な機能のプログラミング
11g リリース1(10.3.6)
B61633-04
  目次
目次

前
 
次
 

2 Web Services Addressingの使用

この章では、Java API for XML Web Services(JAX-WS)を使用したWebLogic Webサービスで、Web Services Addressing(WS-Addressing)を使用する方法について説明します。

この章の内容は以下のとおりです。

WS-Addressingの概要

WS-Addressingは、Webサービスおよびそれに関連するメッセージをアドレッシングするための、トランスポートに依存しないメカニズムを提供します。WS-Addressingを使用すると、エンドポイントはSOAPヘッダー内で一意かつ明確に定義されます。

WS-Addressingには、トランスポートに依存しないアドレッシングを可能にする次の2つの主要なコンポーネントがあります。

例2-1は、では、WS-Addressingを有効にした場合にHTTP 1.2で送信されるSOAP 1.2リクエスト・メッセージを示します。太字で示されているように、WS-Addressingは、一意のメッセージID(wsa:MessageID)、宛先(wsa:To)エンドポイント、リプライ・エンドポイント(wsa:ReplyTo)、および必要なアクション(wsa:Action)を定義するための、トランスポートに依存しないメカニズムを提供します。

例2-1 WS-Addressingを使用したSOAP 1.2メッセージ: リクエスト・メッセージ

<S:Envelope xmlns:S="http://www.w3.org/2003/05/soap-envelope" 
            xmlns:wsa="http://www.w3.org/2005/08/addressing/">  
  <S:Header>  
    <wsa:MessageID>   
      http://example.com/someuniquestring  
    </wsa:MessageID>  
    <wsa:ReplyTo
      <wsa:Address>http://example.com/Myclient</wsa:Address>
    </wsa:ReplyTo>
    <wsa:To>   
      http://example.com/fabrikam/Purchasing  
    </wsa:To>  
    <wsa:Action>   
      http://example.com/fabrikam/SubmitPO  
    </wsa:Action>  
  <S:Header>  
  <S:Body>   
    ...   
   </S:Body>   
</S:Envelope>  

このメッセージへのレスポンスは、例2-2のようになります。RelatesToプロパティによってレスポンス・メッセージと元のリクエスト・メッセージが関連付けられます。

例2-2 WS-Addressingを使用しない場合のSOAP 1.2メッセージ: レスポンス・メッセージ

<S:Envelope
  xmlns:S="http://www.w3.org/2003/05/soap-envelope" 
  xmlns:wsa="http://www.w3.org/2005/08/addressing">
  <S:Header>
    <wsa:MessageID>http://example.com/someotheruniquestring</wsa:MessageID>
    <wsa:RelatesTo>http://example.com/someuniquestring</wsa:RelatesTo>
    <wsa:To>http://example.com/MyClient/wsa:To>
    <wsa:Action>   
      http://example.com/fabrikam/SubmitPOAck  
    </wsa:Action>  
  </S:Header>
  <S:Body>
    ...
  </S:Body>
</S:Envelope>

WS-Addressingは、次のWebLogic JAX-WS拡張機能で使用されます。

次の項では、WebサービスまたはクライアントでWS-Addressingを有効にし、アクション・プロパティおよびフォルト・プロパティを明示的に定義する方法について説明します。

サポートされているWS-Addressing標準に関する説明

WebLogic Webサービスは、次のWeb Service Addressingの標準をサポートしています。

この章では、W3C WS-Addressingの使用についてのみを取り上げます。

WebサービスでのWS-Addressingの有効化

デフォルトでは、WS-AddressingはWebサービス・エンドポイントで無効化されています。そのため、受信したWS-Addressingヘッダーはすべて無視されます。WebサービスでのWS-AddressingをJavaまたはWSDLから有効にするには、次の各項に従います。

Webサービス・エンドポイントでWS-Addressingを有効にすると次のようになります。

WebサービスでのWS-Addressingの有効化(Javaから始める場合)

WebサービスでのWS-AddressingをJavaから有効にするには、Webサービス・クラスでjava.xml.ws.soap.Addressingアノテーションを使用します。必要に応じて、表2-2に定義されているBoolean属性を1つ以上渡すことができます。

表2-2 @Addressingアノテーションの属性

属性 説明

enabled

WS-Addressingを有効にするかどうかを指定します。有効な値は、true(有効)およびfalse(無効)です。この属性のデフォルト値はtrueです。

required

インバウンド・メッセージに対してWS-Addressingルールを適用するかどうかを指定します。有効な値はtrue(適用する)およびfalse(適用しない)です。falseに設定すると、WS-Addressingが有効かどうかを確認するためのチェックがインバウンド・メッセージに対して行われ、有効な場合はルールが適用されます。この属性のデフォルト値はfalseです。


有効にすると、wsaw:UsingAddressing要素が、対応するwsdl:binding要素内に生成されます。詳細は、WebサービスでのWS-Addressingの有効化(WSDLから始める場合)を参照してください。

次の例では、WS-AddressingをJavaから有効にする方法を示します。この例では、エンドポイントでWS-Addressingが実行されます(requiredtrueに設定)。

例2-3 WebサービスでのWS-Addressingの有効化(Javaから始める場合)

package examples;
import javax.jws.WebService;
import javax.xml.ws.soap.Addressing;
 
@WebService(name="HelloWorld", serviceName="HelloWorldService")
@Addressing(enabled=true, required=false)
 
public class HelloWorld {
   public String sayHelloWorld(String message) throws MissingName { ... }
}

WebサービスでのWS-Addressingの有効化(WSDLから始める場合)

WebサービスでのWS-AddressingをWSDLから有効にするには、wsaw:UsingAddressing要素を対応するwsdl:binding要素に追加します。必要に応じて、wsdl:required Boolean属性を追加して、インバウンド・メッセージに対してWS-Addressingルールを適用するかどうかを指定できます。この属性のデフォルト値はfalseです。

次の例では、WS-AddressingをWSDLから有効にする方法を示します。この例では、エンドポイントでWS-Addressingが実行されます(wsdl:requiredtrueに設定)。

例2-4 WebサービスでのWS-Addressingの有効化(WSDLから始める場合)

...
  <binding name="HelloWorldPortBinding" type="tns:HelloWorld">
    <wsaw:UsingAddressing wsdl:required="true" />
    <soap:binding transport="http://schemas.xmlsoap.org/soap/http"
      style="document"/>
    <operation name="sayHelloWorld">
      <soap:operation soapAction=""/>
      <input>
        <soap:body use="literal"/>
      </input>
      <output>
        <soap:body use="literal"/>
      </output>
      <fault name="MissingName">
        <soap:fault name="MissingName" use="literal"/>
      </fault>
    </operation>
  </binding>
...

Webサービス・クライアントでのWS-Addressingの有効化

WS-Addressingは、Webサービス・クライアントで暗黙的または明示的に有効にできます。クライアントで有効にすると、次のようになります。

次の項では、Webサービス・クライアントでWS-Addressingを明示的および暗黙的に有効にする方法、およびWS-Addressingを明示的に無効にする方法について説明します。

Webサービス・クライアントでのWS-Addressingの明示的な有効化

Webサービス・クライアントでは、javax.xml.ws.ServiceオブジェクトのgetPortまたはcreateDispatchメソッドにjavax.xml.ws.soap.AddressingFeatureを引数として渡すことにより、WS-Addressingを明示的に有効にできます。必要に応じて、表2-3に定義されているBooleanパラメータを1つ以上渡すことができます。

表2-3 AddressingFeature機能のパラメータ

パラメータ 説明

enabled

アウトバウンド・メッセージに対してWS-Addressingを有効にするかどうかを指定します。有効な値は、true(有効)およびfalse(無効)です。この属性のデフォルト値はtrueです。

required

インバウンド・メッセージに対してWS-Addressingルールを適用するかどうかを指定します。有効な値は、true(適用する)およびfalse(適用しない)です。falseに設定すると、WS-Addressingが有効かどうかを確認するためのチェックがインバウンド・メッセージに対して行われ、有効な場合はルールが適用されます。この属性のデフォルト値はfalseです。


次の例では、Webサービス・プロキシの作成時に、AddressingFeaturegetPortメソッドに渡して、Webサービス・クライアントのWS-Addressingを有効にする方法を示します。

例2-5 Webサービス・プロキシのWebサービス・クライアントでのWS-Addressingの有効化

package examples.client;
 
import javax.xml.namespace.QName;
import java.net.MalformedURLException;
import java.net.URL;
import examples.client.MissingName_Exception;
import javax.xml.ws.soap.AddressingFeature;

public class Main {
  public static void main(String[] args) throws MissingName_Exception {
    HelloWorldService service;
 
    try {
      service = new HelloWorldService(new URL(args[0] + "?WSDL"), 
                new QName("http://examples/", "HelloWorldService") );
    } catch (MalformedURLException murl) { throw new RuntimeException(murl); }
      
      HelloWorld port = service.getHelloWorldPort(
        new AddressingFeature(true, true));
...
  }
}

次の例では、Dispatchインスタンスの作成時に、AddressingFeaturecreateDispatchメソッドに渡してWebサービス・クライアントのWS-Addressingを有効にする方法を示します。

例2-6 DispatchインスタンスのWebサービス・クライアントでのWS-Addressingの有効化

...
      HelloWorld port = service.getHelloWorldPort(new AddressingFeature(false));
...

Webサービス・クライアントでのWS-Addressingの暗黙的な有効化

wsaw:UsingAddressing拡張要素がWSDLに存在する場合、WS-Addressingは暗黙的に有効になります。詳細は、「WebサービスでのWS-Addressingの有効化(WSDLから始める場合)」を参照してください。

Webサービス・クライアントでのWS-Addressingの無効化

Webサービス・クライアントでは、独自のWS-Addressing処理モジュールを使用する場合など、WS-Addressing処理の明示的な無効化が必要となる場合があります。たとえば、MESSAGEモードのディスパッチ・クライアントを使用して非匿名のReplyToおよびFaultTo処理を実行する場合などです。

次の例では、Webサービス・プロキシの作成時に、Webサービス・クライアントのWS-Addressingを明示的に無効にする方法を示します。この例では、enabledfalseに設定してAddressingFeature機能を呼び出します。

例2-7 Webサービス・クライアントでのWS-Addressingの無効化

...
new AddNumbersImplService().getAddNumbersImplPort(new javax.xml.ws.AddressingFeature(false));
...

WS-AddressingのActionプロパティの関連付け

WS-Addressingは属性wsaw:Actionを定義します。この属性を使用して、WebサービスにWS-AddressingのActionメッセージ・アドレッシング・プロパティを明示的に関連付けることができます。デフォルトでは、WS-Addressingが有効で、Webサービスに明示的に関連付けられているアクションがない場合は、暗黙的なアクションの関連付けが行われます。

次の項では、WS-AddressingのActionプロパティを明示的または暗黙的に関連付ける方法を説明します。

WS-AddressingのActionプロパティの明示的な関連付け(Javaから始める場合)

WS-AddressingのActionプロパティをJavaから明示的にWebサービスに関連付けるには、javax.xml.ws.Actionおよびjavax.xml.ws.FaultActionアノテーションを使用します。

必要に応じて、表2-4に定義されている属性を@Actionアノテーションに対して1つ以上渡すことができます。

表2-4 @Actionアノテーションの属性

属性 説明

input

操作のinputメッセージに対応するActionメッセージ・アドレッシング・プロパティを関連付けます。

output

操作のoutputメッセージに対応するActionメッセージ・アドレッシング・プロパティを関連付けます。

fault

操作のfaultメッセージに対応するActionメッセージ・アドレッシング・プロパティを関連付けます。表2-5に記載されているように、SOAP障害にマップされ、SOAPフォルトにマップし、明示的な関連付けが必要となる例外については、@FaultActionアノテーションを使用して指定する必要があります。


表2-4に定義されている属性を@FaultActionアノテーションに対して1つ以上渡すことができます。

表2-5 @FaultActionアノテーションの属性

属性 説明

className

例外クラスの名前。この属性は必須です。

value

例外のWS-Addressing Actionメッセージ・アドレッシング・プロパティの値。


WS-AddressingのActionプロパティを明示的に関連付けると、wsaw:Action属性が、wsdl:portType要素内の対応するinput要素、output要素およびfault要素に生成されます。詳細は、「WebサービスでのWS-Addressingの有効化(WSDLから始める場合)」を参照してください。

次の例では、@Actionおよび@FaultActionアノテーションを使用して、input、output、およびfaultメッセージに対応するWS-AddressingのActionメッセージ・アドレッシング・プロパティをsayHelloWorldに明示的に関連付ける方法を示します。

例2-8 アクションの明示的な関連付けの例(Javaから始める場合)

...
@Action(
   input = "http://examples/HelloWorld/sayHelloWorldRequest",
   output = "http://examples/HelloWorld/sayHelloWorldResponse",
   fault = { @FaultAction(className = MissingName.class,
                value = "http://examples/MissingNameFault")})
 
   public String sayHelloWorld(String message) throws MissingName {
...

定義すると、エンドポイントのwsdl:operation要素内の対応するinput要素、output要素およびfault要素にwsaw:Action要素が生成されます。これらの要素の詳細は、「WS-Addressing Actionプロパティの明示的な関連付け(WSDLから始める場合)」を参照してください。

WS-AddressingのActionプロパティの明示的な関連付け(WSDLから始める場合)

WS-AddressingのActionプロパティをWSDLから明示的にWebサービスに関連付けるには、wwsaw:Action要素を対応するwsdl:binding要素に追加します。必要に応じて、wsdl:required Boolean属性を追加して、インバウンド・メッセージに対してWS-Addressingルールを適用するかどうかを指定できます。この属性のデフォルト値はfalseです。

次の例では、WSDLファイルで、HelloWorldエンドポイントのsayHelloWorldメソッドのinputoutputおよびfaultメッセージにWS-AddressingのActionメッセージ・アドレッシング・プロパティを明示的に関連付ける方法を示します。

例2-9 アクションの明示的な関連付けの例(WSDLから始める場合)

...
  <portType name="HelloWorld">
    <operation name="sayHelloWorld">
      <input wsaw:Action="http://examples/HelloWorld/sayHelloWorldRequest"
       message="tns:sayHelloWorld"/>
      <output wsaw:Action="http://examples/HelloWorld/sayHelloWorldResponse" 
       message="tns:sayHelloWorldResponse"/>
      <fault message="tns:MissingName" name="MissingName" 
       wsaw:Action="http://examples/MissingNameFault"/>
    </operation>
  </portType>
...

WS-AddressingのActionプロパティの暗黙的な関連付け

WS-Addressingが有効で、WSDLに明示的なアクションが定義されていない場合は、クライアントは次の形式を使用して暗黙的なwsa:Actionヘッダーを送信します。

  • inputメッセージ・アクション: targetNamespace/portTypeName/inputName

  • outputメッセージ・アクション: targetNamespace/portTypeName/outputName

  • faultメッセージ・アクション: targetNamespace/portTypeName/operationName/Fault/FaultName

targetNamespace/portTypeName/[inputName | outputName]

たとえば、次のWSDLからの抜粋のようになります。

<definitions targetNamespace="http://examples/"...>
...
  <portType name="HelloWorld">
    <operation name="sayHelloWorld">
      <input message="tns:sayHelloWorld" name="sayHelloRequest"/>
      <output message="tns:sayHelloWorldResponse" name="sayHelloResponse"/>
      <fault message="tns:MissingName" name="MissingName" />
    </operation>
  </portType>
...
</definitions>

デフォルトのinputおよびoutputアクションは次のように定義されます。

  • inputメッセージ・アクション: http://examples/HelloWorld/sayHelloRequest

  • outputメッセージ・アクション: http://examples/HelloWorld/sayHelloResponse

  • faultメッセージ・アクション: http://examples/HelloWorld/sayHelloWorld/Fault/MissingName

WSDLでinputまたはoutputメッセージ名が指定されていない場合は、それぞれ操作名にRequestまたはResponseが追加された名前が使用されます。たとえば、sayHelloWorldRequestまたはsayHelloWorldResponseのようになります。

匿名WS-Addressingの構成

場合によって、ファイアウォールやDHCP(Dynamic Host Configuration Protocol)などのネットワーク・テクノロジが使用されている環境では、特定のエンドポイントに対してグローバルにアクセス可能なURIの使用が禁止されていることがあります。アドレッシングできないエンドポイントとのメッセージ交換を可能にするために、WS-Addressingの仕様ではwsaw:Anonymous要素を使用した「匿名」エンドポイントがサポートされています。

wsaw:Anonymous要素には表2-6に定義されているいずれかの値を設定できます。

表2-6 wsaw:Anonymous要素の有効な値

説明

optional

リクエスト・メッセージのレスポンス・エンドポイントEPRに匿名URIを含めることができます。

required

リクエスト・メッセージのレスポンス・エンドポイントEPRに匿名URLを含める必要があります。そうしないと、InvalidAddressingHeaderフォルトが返されます。

prohibited

リクエスト・メッセージのレスポンス・エンドポイントEPRに匿名URIを含めないでください。そうしないと、InvalidAddressingHeaderフォルトが返されます。


匿名WS-Addressingを構成するには:

  1. WebサービスでWS-Addressingを有効にし、wsaw:UsingAddressing要素を対応するwsdl:binding要素に追加します。詳細は、「WebサービスでのWS-Addressingの有効化(WSDLから始める場合)」を参照してください。


    注意:

    匿名WS-Addressingが有効な場合は、wsaw:UsingAddressing要素でwsdl:required属性を有効にしないでください。

  2. wsaw:Anonymous要素をwsdl:binding要素内のwsdl:operationに追加します。

次の例では、WSDLファイルで匿名WS-Addressingを有効にする方法を示します。この例では、匿名アドレッシングは必須です。

例2-10 Webサービスでの匿名WS-Addressingの有効化

...
  <binding name="HelloWorldPortBinding" type="tns:HelloWorld">
    <wsaw:UsingAddressing wsdl:required="true" />
    <soap:binding transport="http://schemas.xmlsoap.org/soap/http"
      style="document"/>
    <operation name="sayHelloWorld">
      <soap:operation soapAction=""/>
      <input>
        <soap:body use="literal"/>
      </input>
      <output>
        <soap:body use="literal"/>
      </output>
      <fault name="MissingName">
        <soap:fault name="MissingName" use="literal"/>
      </fault>
    </operation>
    <wsaw:Anonymous>required</wsaw:Anonymous>
  </binding>
...