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
webservicetemplateonjava.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
Comments
Post a Comment