Hitachi

Cosminexus V11 アプリケーションサーバ Webサービス開発ガイド


36.7.3 処理できるSOAPヘッダの設定方法

ハンドラ,Webサービス実装クラス,およびWebサービスクライアントに分けて,処理できるSOAPヘッダの設定方法を説明します。

〈この項の構成〉

(1) SOAPヘッダをハンドラで設定する場合

javax.xml.ws.handler.soap.SOAPHandlerインタフェースを実装したハンドラクラスを作成し,getHeaders()メソッドで,処理できるSOAPヘッダのQNameを含むjava.util.Setを返します。ハンドラでの設定例を次に示します。

public class MySOAPHandler implements SOAPHandler<SOAPMessageContext> {
  private final static Set<QName> headers;
 
  static {
    headers = new HashSet<QName>();
    headers.add(new QName("http://test.org/handler/", "headerA"));
  }
 
  public Set<QName> getHeaders(){
    return headers;
  }
  (以下,そのほかの実装は省略)
}

(2) SOAPヘッダをWebサービス実装クラスで設定する場合

SEIを起点として開発する場合,Webサービス実装クラスにjavax.jws.WebParamアノテーションでアノテートした引数を持つメソッドを定義します。javax.jws.WebParamアノテーションでは,次に示す設定を定義します。

Webサービス実装クラスでの設定例を次に示します。

@WebService
@SOAPBinding (parameterStyle= javax.jws.soap.SOAPBinding.ParameterStyle.BARE)
@HandlerChain (file="handlerchainfile.xml")
public class MyWebService{
  @WebMethod(operationName = "webMethod")
  public String webMethod(
    @WebParam(targetNamespace="http://test.org/handler/", name="message")
    String message,
    @WebParam(targetNamespace="http://test.org/handler/", name="headerS", header = true, WebParam.Mode.IN)
    String headerS
  ){
    (以下,メソッドの実装は省略)
  }
}

WSDLを起点に開発する場合は,WSDL 1.1仕様およびApplication ServerのJAX-WS機能のサポート範囲内で,soap:header要素をWSDLに記述します。Application ServerのJAX-WS機能でのsopa:header要素の記述については,「20.1.22 soap:header要素」を参照してください。

(3) SOAPヘッダをWebサービスクライアントで設定する場合

接続するWebサービスのメタデータであるWSDLに,soap:header要素が含まれる場合は,そのsoap:header要素を処理できます。WSDLの例を次に示します。

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
             xmlns:tns="http://test.org/handler/"
             xmlns:xsd="http://www.w3.org/2001/XMLSchema"
             xmlns="http://schemas.xmlsoap.org/wsdl/"
             targetNamespace="http://test.org/handler/"
             name="HandlerTest01Service">
 
  <types>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
               version="1.0"
               targetNamespace="http://test.org/handler/">
      <xs:element name="headerCL" nillable="true" type="xs:string"></xs:element>
      <xs:element name="message" nillable="true" type="xs:string"></xs:element>
      <xs:element name="testResponse" nillable="true" type="xs:string"></xs:element>
    </xs:schema>
  </types>
 
  <message name="test">
    <part name="message" element="tns:message"></part>
    <part name="headerCL" element="tns:headerCL"></part>
  </message>
  <message name="testResponse">
    <part name="testResponse" element="tns:testResponse"></part>
    <part name="headerCL" element="tns:headerCL"></part>
  </message>
 
  <portType name="HandlerTest01">
    <operation name="test" parameterOrder="message headerCL">
      <input message="tns:test"></input>
      <output message="tns:testResponse"></output>
    </operation>
  </portType>
  <binding name="HandlerTest01Binding" type="tns:HandlerTest01">
    <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"></soap:binding>
    <operation name="test">
      <soap:operation soapAction=""></soap:operation>
      <input>
        <soap:body use="literal" parts="message"></soap:body>
        <soap:header message="tns:test" part="headerCL" use="literal"></soap:header>
      </input>
      <output>
        <soap:body use="literal" parts="testResponse"></soap:body>
        <soap:header message="tns:testResponse" part="headerCL" use="literal"></soap:header>
      </output>
    </operation>
  </binding>
 
  <service name="HandlerTest01Service">
    <port name="HandlerTest01Port" binding="tns:HandlerTest01Binding">
      <soap:address location="http://localhost:80/SOAPHeaderTest/HandlerTestService431"></soap:address>
    </port>
  </service>
</definitions>

この場合は,要素名{http://test.org/handler/}headerCLのSOAPヘッダを処理できます。WSDLのsoap:header要素については「20.1.22 soap:header要素」を参照してください。