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"   
   class="nl.aaaa.bbbb.service.webclient.ContactManagementGatewayImpl">
       <property name="databaseName" ref="aDatabase" />
       <property name="authInfo" ref="authInfo" />
       <property name="defaultUri"  value="https://aaa.bbbb.com/soap/1.5/DialogueService" />
       <property name="messageFactory" ref="messageFactory" />
       <property name="marshaller" ref="xmlBeansMarshaller"/>
       <property name="unmarshaller" ref="xmlBeansMarshaller"/>
</bean>
<bean id="messageFactory" class="org.springframework.ws.soap.saaj.SaajSoapMessageFactory"/>
<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().
    marshalSendAndReceive(removeContactGroupMembershipDoc
   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.

About the author

haiko By Haiko van der Schaaf Google