Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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.

like image 698
pandeis Avatar asked Sep 05 '13 16:09

pandeis


People also ask

How do you call a SOAP web service from another webservice in Java?

In the IDE I can generate the required code for the webservice call using the provided 'generate code: web service invoke operation' feature. This has added a @WebServiceRef(wsdlLocation = "WEB-INF/wsdl/servicename. wsdl") and some code to create a port and call the target webservice operation.

How do you call a SOAP web service from a Spring boot?

Steps to Consume a SOAP service : Create spring boot project and Get the WSDL from the provider . Convert the WSDL to Stub. Understand the request ,response and the types ,operations using any tool like SOAP UI. Form the request object by mapping data and call the soap uri with marshal the java objects as XML.


2 Answers

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();
    }

}
like image 84
Taoufik Mohdit Avatar answered Oct 18 '22 00:10

Taoufik Mohdit


@Taoufik Mohdit answer is complete!!

To build the input and output objects you can use Webservice-Client: Common approach with Spring WS, JAXB and just one WSDL file? to some how build these objects automatically

like image 22
Alireza Fattahi Avatar answered Oct 18 '22 00:10

Alireza Fattahi