Search code examples
springweb-serviceswsdlspring-ws

Consume webservice service in SPRING-WS using wsdl


I have WSDL with me .eg: /sample/hello?wsdl . I want to invoke the service the webservice by configuring in Spring-ws. I passed this wsdl as parameter to tags in springconfig.xml. Can anyone please tell me how to consume this webservice in Spring-ws.


Solution

  • 1. Set up project dependencies

    add the following dependencies to the pom file:

    <dependency>
        <groupId>org.springframework.ws</groupId>
        <artifactId>spring-ws-core</artifactId>
        <version>2.1.3.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
        <version>4.2.5</version>
    </dependency>
    

    2. Set up web service application context

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="
            http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">
    
        <bean id="messageFactory" class="org.springframework.ws.soap.saaj.SaajSoapMessageFactory" />
    
        <bean id="marshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
            <property name="contextPath" value="com.yourcomany.model" />
        </bean>
    
        <bean id="webServiceTemplate" class="org.springframework.ws.client.core.WebServiceTemplate">
            <constructor-arg ref="messageFactory" />
            <property name="marshaller" ref="marshaller"></property>
            <property name="unmarshaller" ref="marshaller"></property>
            <property name="messageSender">
                <bean
                    class="org.springframework.ws.transport.http.HttpComponentsMessageSender" />
            </property>
            <property name="defaultUri"
                value="http://<hostname>:<portnumber>/sample/hello" />
        </bean>
    
    </beans>
    

    3. Set up model classes which would map to your SOAP request/response objects

    For example, if your SOAP request XML looked like

    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xxx="http://yourcomapny.com">
       <soapenv:Header/>
       <soapenv:Body>
          <xxx:InputParameters>
             <xxx:paramONE>1</xxx:paramONE>
          </xxx:InputParameters>
       </soapenv:Body>
    </soapenv:Envelope>
    

    and your SOAP response XML looked like:

    <env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
       <env:Header>
          ...
       </env:Header>
       <env:Body>
          <xxx:OutputParameters xmlns:xxx="http://yourcompany.com">
             <xxx:paramONE>0</xxx:paramONE>
          </xxx:OutputParameters>
       </env:Body>
    </env:Envelope>
    

    the corresponding classes (under the package you specified in the marshaller bean: com.yourcompany.model) would be respectively:

    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "", propOrder = { "paramONE" })
    @XmlRootElement(name = "InputParameters", namespace = "http://yourcompany.com")
    public class InputParameters {
    
        @XmlElement(required = true, namespace = "http://yourcompany.com")
        private String paramONE;
    
        public String getParamONE() {
            return paramONE;
        }
    
        public void setParamONE(String paramONE) {
            this.paramONE = paramONE;
        }
    
    }
    

    and

    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "", propOrder = { "paramONE" })
    @XmlRootElement(name = "OutputParameters", namespace = "http://yourcompany.com")
    public class OutputParameters {
    
        @XmlElement(required = true, namespace = "http://yourcompany.com")
        private BigDecimal paramONE;
    
        public BigDecimal getParamONE() {
            return this.paramONE;
        }
    
        public void setParamONE(BigDecimal paramONE) {
            this.paramONE= paramONE;
        }
    
    }
    

    4. Add an Object Factory (under package com.yourcompany.model) to create request/response objects

    @XmlRegistry
    public class ObjectFactory {
    
        public ObjectFactory() {
        }
    
        public InputParameters createYourRequest() {
            return new InputParameters();
        }
    
        public OutputParameters createYourResponse() {
            return new OutputParameters();
        }
    
    }
    

    5. Create a client to consume the service

    Interface:

    public interface YourService {
    
        BigDecimal getValue(String paramOne);
    
    }
    

    Implementation

    @Component("yourServiceClient")
    public class YourServiceClient implements YourService {
    
        private static final ObjectFactory WS_CLIENT_FACTORY = new ObjectFactory();
    
        private WebServiceTemplate webServiceTemplate;
    
        @Autowired
        public YourServiceClient(WebServiceTemplate webServiceTemplate) {
            this.webServiceTemplate = webServiceTemplate;
        }
    
        @Override
        public BigDecimal getValue(String paramOne) {
            InputParameters request = WS_CLIENT_FACTORY
                    .createYourRequest();
            request.setParamONE(paramOne);
    
            OutputParameters response = (OutputParameters) webServiceTemplate
                    .marshalSendAndReceive(request);
    
            return response.getParamONE();
        }
    
    }