Hitachi

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


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