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サービス実装クラスを作成する」を参照してください。