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

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

<この項の構成>
(1) SOAPヘッダをハンドラで設定する場合
(2) SOAPヘッダをWebサービス実装クラスで設定する場合
(3) SOAPヘッダをWebサービスクライアントで設定する場合

(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要素」を参照してください。