web-dev-qa-db-fra.com

Utiliser le service Web dans SPRING-WS à l'aide de wsdl

J'ai WSDL avec moi, par exemple:/sample/hello? Wsdl. Je souhaite appeler le service Webservice en le configurant dans Spring-ws. J'ai passé ce wsdl en tant que paramètre pour les balises dans springconfig.xml. Quelqu'un peut-il me dire, s'il vous plaît, comment utiliser ce service Web dans Spring-ws. 

19
pandeis

1. Configurer les dépendances du projet

ajoutez les dépendances suivantes au fichier pom:

<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. Configurer le contexte d'application du service Web

<?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. Configurez des classes de modèle qui mapperaient sur vos objets de requête/réponse SOAP

Par exemple, si votre requête XML SOAP ressemblait à

<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>

et votre réponse XML SOAP ressemblait à:

<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>

les classes correspondantes (sous le paquet que vous avez spécifié dans le bean marshaller: com.votreentreprise.model) seraient respectivement:

@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;
    }

}

et

@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. Ajoutez une fabrique d'objets (sous le package com.yourcompany.model) pour créer des objets demande/réponse.

@XmlRegistry
public class ObjectFactory {

    public ObjectFactory() {
    }

    public InputParameters createYourRequest() {
        return new InputParameters();
    }

    public OutputParameters createYourResponse() {
        return new OutputParameters();
    }

}

5. Créer un client pour utiliser le service

Interface:

public interface YourService {

    BigDecimal getValue(String paramOne);

}

La mise en oeuvre

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

}
48
Taoufik Mohdit

@Taoufik Mohdit réponse est terminée !!

Pour créer les objets d'entrée et de sortie, vous pouvez utiliser Webservice-Client: approche commune avec Spring WS, JAXB et un seul fichier WSDL? à certains comment construire ces objets automatiquement

2
Alireza Fattahi

Étant donné que cette question est toujours d'actualité, j'ai pensé publier une mise à jour reflétant un certain nombre de modifications introduites par la version récente du framework Spring Web Services et de Spring en général:

  1. L'introduction de Spring Boot permet de tirer parti des POM "de démarrage" pour simplifier votre configuration Maven. Il existe un démarreur spring-boot-starter-web-services spécifique pour Spring-WS
  2. Au lieu de spécifier les fichiers de configuration Spring à l'aide de XML, Spring JavaConfig a été introduit. Il fournit une option de type Java pur et sécurisée pour la configuration de Spring.
  3. La génération d'objets requête/réponse basés sur un fichier WSDL donné peut être automatisée à l'aide de plug-ins Maven. Le plugin utilisé par les exemples Spring-WS est le maven-jaxb2-plugin.

La WebServiceTemplate est toujours la classe principale pour l'accès au service Web côté client. Pour plus d'informations, vous pouvez vérifier ceci exemple détaillé sur la façon de consommer un service Web utilisant Spring-WS à partir d'un fichier WSDL } que j'ai écrit.

0
CodeNotFound