java - How to build SOAP client in Spring? -


i able send requests web service using javax.xml.soap.*, covert code use webservicetemplate.

  • i struggling creating request , result objects. (sample ive found related xml not soap)
  • i wondering if there advantages of using webservicetemplate on java.xml.soap. if there not doing correctly? given need connected 20 web services.

the service has findevents follows:

<soapenv:envelope xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xmlns:xsd="http://www.w3.org/2001/xmlschema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soap="http://ticketmaster.productserve.com/v2/soap.php" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">    <soapenv:header/>    <soapenv:body>       <soap:findevents soapenv:encodingstyle="http://schemas.xmlsoap.org/soap/encoding/">          <request xsi:type="soap:request">             <!--you may enter following 7 items in order-->             <apikey xsi:type="xsd:string">?</apikey>             <country xsi:type="xsd:string">?</country>             <resultsperpage xsi:type="xsd:int">?</resultsperpage>             <currentpage xsi:type="xsd:int">?</currentpage>             <sort xsi:type="soap:request_sort">                <!--you may enter following 2 items in order-->                <field xsi:type="xsd:string">?</field>                <order xsi:type="xsd:string">?</order>             </sort>             <filters xsi:type="soap:arrayofrequest_filter" soapenc:arraytype="soap:request_filter[]"/>             <updatedsince xsi:type="xsd:string">?</updatedsince>          </request>       </soap:findevents>    </soapenv:body> </soapenv:envelope> 

my code follows:

try {     soapconnectionfactory soapconnectionfactory =             soapconnectionfactory.newinstance();     soapconnection connection =             soapconnectionfactory.createconnection();      messagefactory factory =             messagefactory.newinstance();      soapmessage message = factory.createmessage();      soapheader header = message.getsoapheader();     header.detachnode();      soapbody body = message.getsoapbody();      soapfactory soapfactory =             soapfactory.newinstance();      name bodyname;     bodyname = soapfactory.createname("findevents",             "xsd", "http://ticketmaster.productserve.com/v2/soap.php");       soapbodyelement getlist =             body.addbodyelement(bodyname);       name childname = soapfactory.createname("findevents");     soapelement eventrequest = getlist.addchildelement(childname);      childname = soapfactory.createname("apikey");     soapelement apikey = eventrequest.addchildelement(childname);     apikey.addtextnode("myapi");      childname = soapfactory.createname("country");     soapelement cid = eventrequest.addchildelement(childname);     cid.addtextnode("uk");     message.writeto(system.out); //show message details      url endpoint = new url("http://ticketmaster.productserve.com/v2/soap.php");     soapmessage response =             connection.call(message, endpoint);      connection.close();      //soapbody soapbody = response.getsoapbody();     soapmessage sm = response;      system.out.println("response:");     bytearrayoutputstream out = new bytearrayoutputstream();     sm.writeto(out);       string validsoap = "<?xml version=\"1.0\"?> " + out.tostring();     system.out.println("it validsoap: " + validsoap);  //validsoap message      saxbuilder builder = new saxbuilder();     reader in = new stringreader(validsoap);  //reading character stream     document doc = null; //empty jdom document instantiated     doc = builder.build(in); //build jdom document      element root = doc.getrootelement(); //envelope     list allchildren = root.getchildren(); //list of child elements     system.out.println("root is:" + ((element) allchildren.get(0)).getname());    listchildren(root);  } catch (exception ex) {     ex.printstacktrace(); } 

new code

  webservicetemplate.sendsourceandreceivetoresult                ("http://ticketmaster.productserve.com/v2/soap.php",source, result);    @xmlrootelement public class findevents {     @xmlelement     request request;      public request getrequest() {         return request;     }      public void setrequest(request request) {         this.request = request;     }  }  @xmlseealso(sortticket.class) public class request {     @xmlelement     string apikey;     @xmlelement     string country;     @xmlelement     int resultsperpage;     @xmlelement     int currentpage;     @xmlelement(name = "sort")     sortticket sort;     @xmlelement     string[] filters;     @xmlelement     string updatedsince;      public string getapikey() {         return apikey;     }      public void setapikey(string apikey) {         this.apikey = apikey;     }      public string getcountry() {         return country;     }      public void setcountry(string country) {         this.country = country;     }      public int getresultsperpage() {         return resultsperpage;     }      public void setresultsperpage(int resultsperpage) {         this.resultsperpage = resultsperpage;     }      public int getcurrentpage() {         return currentpage;     }      public void setcurrentpage(int currentpage) {         this.currentpage = currentpage;     }      public sortticket getsort() {         return sort;     }      public void setsort(sortticket sort) {         this.sort = sort;     }      public string[] getfilters() {         return filters;     }      public void setfilters(string[] filters) {         this.filters = filters;     }      public string getupdatedsince() {         return updatedsince;     }      public void setupdatedsince(string updatedsince) {         this.updatedsince = updatedsince;     }  }  public class sortticket {     @xmlelement     string field;     @xmlelement     string order;      public string getfield() {         return field;     }      public void setfield(string field) {         this.field = field;     }      public string getorder() {         return order;     }      public void setorder(string order) {         this.order = order;     }  } 

since have generated dto classes jaxb annotation can create marshaller ,unmarshaller , create objects of dto classes (sortticket,request,findevents) , send objects directly instead of using xml request

webservicetemplate.marshalsendandreceive(findevents); 

something you'll have configure.

create marshaller

<oxm:jaxb2-marshaller id="marshaller" contextpath="com.yourcontextpath" /> 

create web service template

<bean id="webservicetemplate" class="org.springframework.ws.client.core.webservicetemplate">     <property name="marshaller" ref="marshaller" />     <property name="unmarshaller" ref="marshaller" />     <property name="defaulturi"         value="http://ticketmaster.productserve.com/v2/soap.php" /> </bean> 

and in class's method want send soap request inject webservicetemplate using @autowired

@autowired private webservicetemplate webservicetemplate;  public void sendsamplesoaprequest() {     sortticket sortticket=new sortticket();    // set values    request request=new request();    //set values    request.setsort(sortticket);    findevents findevents=new findevents();    setrequest(request)    object response=webservicetemplate.marshalsendandreceive(findevents);  } 

marshalsendandreceive message uses jaxb marshaller convert objects (marked jaxb annotation)to xml.so above findevents object converted xml from.

regarding second point advantages of using webservicetemplate on java.xml.soap. : don't have create soapelements manually create object , send instead of big code manually handling it. since you'll have connect 20 different web services easier create dto objects , send them directly.you may need modify above samples little.may remove deault uri

<bean id="webservicetemplate" class="org.springframework.ws.client.core.webservicetemplate">     <property name="marshaller" ref="marshaller" />     <property name="unmarshaller" ref="marshaller" /> </bean> 

and while sending request give uri request

object response=webservicetemplate.marshalsendandreceive(uri,object); 

for sending multiple server

object response1=webservicetemplate.marshalsendandreceive(uri1,object); object response1=webservicetemplate.marshalsendandreceive(uri2,object)  

uri1 , uri2 can different soap service , if don't have wsdl can send xml method

sendsourceandreceivetoresult(uri1,source, result); sendsourceandreceivetoresult(uri2,source, result); 

sending uri in send method on rides default uri

for example check this check api doc


Comments

Popular posts from this blog

javascript - Google App Script ContentService downloadAsFile not working -

javascript - Function overwritting -

c# - Exception when attempting to modify Dictionary -