Using XMLBeans and Spring-WS for a SOAP webservice client

While the use of SOAP for webservices probably is on the decline, I had to write a client for one. Persuaded by Spring Web Services ( Spring-WS ) that their choice of ‘Contract First’ the right approach is, the second decision was to choose an Object/ XML mapping framework. Because the type of the webservice was SOAP, I knew I had to deal with the XML-language and the chosen mapping framework should not limit the interpretation possibilities of the WSDL-file. The promise of XMLBeans to support theĀ  full XML infoset was for me the decisive argument to use this framework from a rather overwhelming number of options like Castor, JAXB, JiBX, XStream to name a few.

The jump on the Maven2 train last year paid out as I pleasantly found a Maven plugin using xmlbeans to generate the java classes from a xsd file. Always keeping anything related to XML-technology at bay, the creation of a xsd file was the most difficult task for me. But as I experimented with copying parts of the available WSDL-file I quickly was able to construct a xsd file which then could be fed to the maven-plugin to generate the java source.

Packaging the generated code in a seperate Jar I made use of the spring-ws classes to create the client. Defining the beans as like this:

<bean id="contactWebServiceGateway"   
       <property name="databaseName" ref="aDatabase" />
       <property name="authInfo" ref="authInfo" />
       <property name="defaultUri"  value="" />
       <property name="messageFactory" ref="messageFactory" />
       <property name="marshaller" ref="xmlBeansMarshaller"/>
       <property name="unmarshaller" ref="xmlBeansMarshaller"/>
<bean id="messageFactory" class=""/>
<bean id="xmlBeansMarshaller" class="org.springframework.oxm.xmlbeans.XmlBeansMarshaller"/>

I have a webservice client where spring-ws and XMLBeans do the heavy lifting of doing marshalling and SOAP-protocol stuff. The only few things there has te done by the client, a subclass of WebServiceGatewaySupport, is to fill the values of the generated xmlbeans and do the actual call to the webservice.

public class ContactManagementGatewayImpl extends WebServiceGatewaySupport implements ContactManagementGateway {
    public void unsubcribeContact(
    // the actual call
    Object response = getWebServiceTemplate().
   removeContactGroupMembershipResponseDoc = (RemoveContactGroupMembershipResponseDocument) response;

That is all. In the end it took me longer to decide which Object/ XML mapping framework I should use then writing the client.