soapヘッダと処理


次へ:http://www.blogjava.net/fool/archive/2006/11/13/80901.html
soapヘッダと処理
   soappheaderelementオブジェクト内の属性は、受信者がどのようにメッセージを処理するかを決定し、header属性は、拡張メッセージを提供する方法を提供し、アイデンティティ認証、支払い、転送メッセージのような関連することを提供していると考えられる。jax-rpcクライアントアプリ(ビットプログラム、ダイナミックエージェント、dii)は、soapファイルヘッダのサポートを提供していません。saaj appiはサポートを提供しています。すべてのメッセージ処理プログラムは、javax.xml.rpc.handler.handlerインターフェースを実装しなければならない。このインターフェースは、SOapメッセージを処理するための一連の方法がある。javax.xml.rpc.handler.generanchanderはデフォルトのアダプター類で、私達自身のメッセージ処理プログラムを作成する時にこの種類から私達の興味がある方法を上書きして書けばいいです。しかし、各handlerはgetheader()方法とhandlequest()方法を実現しなければなりません。具体的な実現:
サービスクラスのhandleservic:
package handler; public class handlerservice implements handlerserviceinterface1 {  public void testinoutheader(string bodymsg, string headermsg)   {      system.out.print("testinheader: " + bodymsg + "," + headermsg);    } } 
メッセージ処理クラス:
package handler; import javax.xml.rpc.handler.*;import javax.xml.soap.*;import javax.xml.namespace.qname;import javax.xml.rpc.jaxrpcexception;import javax.xml.rpc.handler.soap.soapmessagecontext;import java.util.iterator; public class cutomerhandler extends generichandler {    protected qname[] headers = new qname[] {                                new qname("http://handler", "headermsg")    };    public qname[] getheaders() {        return headers;    }//   handler             .     //       soap  .      false jax-rpc      soap      soap    。  saaj api     j2ee web service  ( )    public boolean handlerequest(messagecontext msgcontext) {         try {            soapmessage soapmessage = ((soapmessagecontext) msgcontext).                                      getmessage();            soapheader soapheader = soapmessage.getsoapheader();            iterator it = soapheader.extractallheaderelements();            while (it.hasnext()) {                soapheaderelement headerelement = (soapheaderelement) it.next();                name headername = headerelement.getelementname();                system.out.println(" header name is: " +                                   headername.getqualifiedname());                system.out.println(" header value is: " +                                   headerelement.getvalue());            }            soapbody soapbody = soapmessage.getsoapbody();            iterator bodyiterator = soapbody.getchildelements();            while (bodyiterator.hasnext()) {                soapbodyelement soapbodyelement = (soapbodyelement)                                                  bodyiterator.next();                system.out.println("soapbodyelement print: " +                                   soapbodyelement.getnodename());            }            soapbodyelement nextsoapbodyelement = (soapbodyelement) soapbody.                                                  getchildelements().next();            soapelement soapelement = (soapelement) nextsoapbodyelement.                                      getchildelements().next();            system.out.println("soapelement print: " + soapelement.getlocalname() +                               "  " + soapelement.getvalue());        } catch (soapexception e) {            throw new jaxrpcexception(e);        }         return true;    } 
//   soap    ,    soap            .    public boolean handleresponse(messagecontext msgcontext) {         try {            soapmessage soapmessage = ((soapmessagecontext) msgcontext).                                      getmessage();            soapheader soapheader = soapmessage.getsoapheader();             soapbody soapbody = soapmessage.getsoapbody();            soapbodyelement soapbodyelement = (soapbodyelement) soapbody.                                              getchildelements().next();            string rpcname = soapbodyelement.getelementname().getlocalname();                 soapfactory soapfactory = soapfactory.newinstance();                name headername = soapfactory.createname("headermsg", "ns","http://handler");                soapheaderelement she = soapheader.addheaderelement(headername);                she.setvalue("return header message");         } catch (soapexception e) {            throw new jaxrpcexception(e);        }         return true;    }  }
          wstools       :<configuration xmlns="http://www.jboss.org/jbossws-tools"   xmlns:xsi="http://www.w3.org/2001/xmlschema-instance"   xsi:schemalocation="http://www.jboss.org/jbossws-tools http://www.jboss.org/jbossws-tools/schema/jbossws-tool_1_0.xsd">  <java-wsdl>    <service name="testservice" style="rpc" endpoint="handler.handlerserviceinterface1">       <operation name="testinoutheader">        <parameter type="java.lang.string"/>        <parameter type="java.lang.string"/>      </operation>     </service>    <namespaces target-namespace="http://handler" type-namespace="http://handler"/>    <mapping file="handlerserviceinterface1.xml"/>    <webservices servlet-link="handlerserviceinterface1"/>  </java-wsdl></configuration>
wstoolsツールの使用についてはJ 2 ee web service開発(一)を参照してください。
生成されたwebservice記述子ファイルに以下のコードを手動で追加します。
     <ハンドル
     
     
    soapメッセージヘッダを処理するクラスを構成するために使用します。
クライアントコード:j 2 ee web serive開発(三)で紹介したapiを利用してsaajクライアントコードを書くのは難しくないです。ここでは、jboss wsがdiiを利用してsoapヘッダの処理を実現し、標準jax-rpc appiを拡張しています。
package handler;import javax.xml.namespace.qname;import javax.xml.rpc.call;import javax.xml.rpc.parametermode;import javax.xml.rpc.service;import org.jboss.ws.constants;import org.jboss.ws.jaxrpc.callimpl;import javax.xml.rpc.servicefactory;import java.util.*;public class handlerclient {    public handlerclient() {    }     public static void main(string[] args) throws exception{        handlerclient handlerclient = new handlerclient();        handlerclient.testunboundinoutheader();    }    public void testunboundinoutheader() throws exception{        service service = servicefactory.newinstance().createservice(new qname("testservice"));        callimpl call = (callimpl)service.createcall();        call.setoperationname(new qname("http://handler", "testinoutheader"));        call.addparameter("string_1", constants.type_literal_string, parametermode.in);        call.addparameter("string_2", constants.type_literal_string, parametermode.in);        call.settargetendpointaddress("http://hechang:8082/customer-handler/services/handlerserviceinterface1");        qname xmlname = new qname("http://handler", "headermsg");        // xmlname = new qname("http://otherns", "headervalue");         call.addunboundheader(xmlname, constants.type_literal_string, string.class, parametermode.in);        call.setunboundheadervalue(xmlname, " in header message");//                     object retobj = call.invoke(new object[]{"hello world!", "in header message"});               string unboundret = (string)call.getunboundheadervalue(xmlname);       //                   system.out.println(" unboundreturn: "+unboundret);} }