WebServiceTemplate
Here is the bean
<bean id="wsTemplate" class="org.springframework.ws.client.core.WebServiceTemplate"> <property name="defaultUri" value="http://localhost:8080/quote_test"/> <property name="marshaller" ref="QuoteRequestJAXBMarshaller"/> <property name="unmarshaller" ref="QuoteResponseJAXBMarshaller"/> </bean>
You will need Marshaller and Unmarshaller , its part of oxm
include these in the header
setup the marshaller and unmarshaller
include these in the header
xmlns:oxm = "http://www.springframework.org/schema/oxm"
<oxm:jaxb2-marshaller id = "QuoteRequestJAXBMarshaller"> <oxm:class-to-be-bound name = "com.quote.services.model.Quote"/> </oxm:jaxb2-marshaller> <oxm:jaxb2-marshaller id = "QuoteResponseJAXBMarshaller"> <oxm:class-to-be-bound name = "com.quote.services.model.QuoteResponse"/> </oxm:jaxb2-marshaller>
Marshaller and a UnMarshaller can be generated by xjc utility on schema (or) wsimport on WSDL. If you don't have the schema , it can be generated by the xml using many tools like http://www.freeformatter.com/ Here is example of xjc using ant
<?xml version = "1.0" encoding = "UTF-8"?> <project name = "mywsproject" default = "generate"> <property file = "build.properties"/> <fileset id = "tools" dir = "tools"> <include name = "**/*.jar"/> </fileset> <taskdef name = "xjc" classname = "com.sun.tools.xjc.XJCTask"> <classpath> <fileset refid = "tools"/> </classpath> </taskdef> <target name = "generate"> <xjc schema = "src/main/xml/quote.xsd" destdir = "src/main/java" package = "com.quote.services.model"/> </target> </project>
WSDL will have the schema and "wsimport" utility will generate the Classes for Marshaling and Un-Marshaling ( details of the wsimport utility can be found here http://ajaxrocks.blogspot.com/2013/08/jax-ws-call-ws-using-maven.html) ,after generation delete the webservice and webservice port type classes .
// @XmlElementDecl(namespace = "http://www.test.com/WS/QuoteWS", name = "QuoteResponse") // public JAXBElement<QuoteResponse> createQuoteResponse(QuoteResponse value) { // return new JAXBElement<QuoteResponse>( , QuoteResponse.class, null, value); // }
This also can happen with the attributes . Example below "errorMessage" is string but not defined correctly in the schema so it become a JAXBElement . Comment these out and create them as String , generate getters and Setters
// @XmlElementRef(name = "errorMessage", type = JAXBElement.class) // protected JAXBElement<String> errorMessage;Calling from Java Service , is now easy as calling a method and getting a response
@Service("myQuoteService") public class QuoteServiceImpl { @Autowired private WebServiceOperations wsTemplate; public QuoteResponse generateQuote() { Quote quote = new Quote(); quote.setPrice("99.99"); quote.setAmount("100"); QuoteRequest quoterequest = new QuoteRequest(); quoterequest.setQuote(quote); return (QuoteResponse)wsTemplate.marshalSendAndReceive(quoterequest); } }
1 comment:
Hey,
Thanks for such a wonderful post its very useful. I hope you publish regularly like this posts.
Post a Comment