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アノテーションでは,次に示す設定を定義します。
-
header属性にtrueを設定する。
-
mode属性にjavax.jws.WebParam.Mode.INまたはjavax.jws.WebParam.Mode.INOUTを設定する。
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要素」を参照してください。