9.3.1 プロバイダ実装クラスを作成する
プロバイダ実装クラスcom.sample.UserInfoImplを作成する例を次に示します。作成したcom.sample.UserInfoImplは,UTF-8形式でc:\temp\jaxws\works\dispatch_provider\server\src\com\sample\ディレクトリに保存してください。
package com.sample; import java.util.Iterator; import javax.xml.namespace.QName; import javax.xml.soap.AttachmentPart; import javax.xml.soap.MessageFactory; import javax.xml.soap.SOAPBody; import javax.xml.soap.SOAPBodyElement; import javax.xml.soap.SOAPElement; import javax.xml.soap.SOAPException; import javax.xml.soap.SOAPMessage; import javax.xml.ws.Provider; @javax.xml.ws.WebServiceProvider(serviceName="UserInfoService") @javax.xml.ws.ServiceMode(value=javax.xml.ws.Service.Mode.MESSAGE) public class UserInfoImpl implements Provider<SOAPMessage>{ public SOAPMessage invoke( SOAPMessage request ){ // 応答メッセージ SOAPMessage response = null; // 添付ファイル(顔写真) AttachmentPart attachment = null; try { // 要求メッセージからデータ取得 // 社員番号を取得 SOAPBody soapBody = request.getSOAPBody(); SOAPBodyElement reqRoot = (SOAPBodyElement)soapBody.getChildElements().next(); Iterator number_iterator = reqRoot.getChildElements(); String number = ((SOAPElement)number_iterator.next()).getFirstChild().getNodeValue(); // 顔写真を取得 Iterator attachment_iterator = request.getAttachments(); while(attachment_iterator.hasNext()){ attachment = (AttachmentPart)attachment_iterator.next(); } // 顔写真の登録処理など取得した添付ファイルに対して // ほかに必要な処理があれば実装する // 応答メッセージの生成 response = MessageFactory.newInstance().createMessage(); SOAPBody resSoapBody = response.getSOAPBody(); SOAPBodyElement resRoot = resSoapBody.addBodyElement( new QName("http://sample.com", "result")); SOAPElement soapElement = resRoot.addChildElement( new QName("http://sample.com", "value")); // 登録確認メッセージを設定 if(null == attachment){ soapElement.addTextNode("Failure(no image)."); } else { soapElement.addTextNode("Success."); } } catch (SOAPException e) { e.printStackTrace(); } return response; } }
SOAP 1.2の場合は,作成したプロバイダ実装クラスに対してjavax.xml.ws.BindingTypeアノテーションを付与してください。設定する値は,SOAP 1.2/HTTPバインディングを意味する"http://www.w3.org/2003/05/soap/bindings/HTTP/"にします。javax.xml.ws.BindingTypeアノテーションを付与する例を次に示します。
package com.sample; import java.util.Iterator; import javax.xml.namespace.QName; import javax.xml.soap.AttachmentPart; import javax.xml.soap.MessageFactory; import javax.xml.soap.SOAPBody; import javax.xml.soap.SOAPBodyElement; import javax.xml.soap.SOAPElement; import javax.xml.soap.SOAPException; import javax.xml.soap.SOAPMessage; import javax.xml.ws.Provider; @javax.xml.ws.BindingType("http://www.w3.org/2003/05/soap/bindings/HTTP/") @javax.xml.ws.WebServiceProvider @javax.xml.ws.ServiceMode(value=javax.xml.ws.Service.Mode.MESSAGE) public class UserInfoImpl mplements Provider<SOAPMessage>{ public SOAPMessage invoke( SOAPMessage request ){ (以降はSOAP1.1の場合と同じ)
なお,javax.xml.ws.BindingTypeアノテーションの値には,"http://www.w3.org/2003/05/soap/bindings/HTTP/"の代わりに定数値フィールドjavax.xml.ws.soap.SOAPBinding.SOAP12HTTP_BINDINGを設定することもできます。定数値フィールドを設定した場合の例については,「5.3.1 Webサービス実装クラスを作成する」を参照してください。