Consommer le service webservice au printemps-WS en utilisant wsdl

j'ai WSDL avec moi .eg: / sample / hello?wsdl . Je veux invoquer le service webservice en configurant dans Spring-ws. J'ai passé ce WSDL comme paramètre à tags dans springconfig.XML. Quelqu'un peut-il s'il vous plaît me dire comment consommer ce service Web au printemps-ws.

18
demandé sur pandeis 2013-09-05 20:55:24

3 réponses

1. Établir les dépendances du projet

ajouter 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. Définir le contexte de l'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. Créez des classes de modèles qui correspondraient à vos objets SOAP request/response

par exemple, si votre requête SOAP XML 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 SOAP XML 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 vous spécifié dans le haricot marshaller: com.yourcompany.modèle) 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. Ajouter une usine D'objets (sous package com.yourcompany.modèle) pour créer de requête/réponse objets

@XmlRegistry
public class ObjectFactory {

    public ObjectFactory() {
    }

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

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

}

5. Créer un client pour consommer le service

Interface:

public interface YourService {

    BigDecimal getValue(String paramOne);

}

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
répondu Taoufik Mohdit 2014-09-02 10:50:47

@Taoufik Mohdit la réponse est complète!!

pour construire les objets input ET output vous pouvez utiliser Webservice-Client: approche commune avec Spring WS, JAXB et un seul fichier WSDL? pour certains comment construire ces objets automatiquement

2
répondu Alireza Fattahi 2017-05-23 11:54:13

étant donné que cette question est toujours active, j'ai pensé publier une mise à jour qui reflète un certain nombre de changements que la récente version du cadre des services web du printemps et le printemps en général introduisent:

  1. l'introduction de la botte à ressort permet de tirer parti des pom 'starter' pour simplifier votre configuration Maven. Il y a un spring-boot-starter-web-services démarreur pour le Printemps-WS
  2. au lieu de spécifier des fichiers de configuration de ressort en utilisant XML, Printemps JavaConfig a été introduit qui fournit une option de type-sûr, pur-Java pour la configuration de Spring.
  3. la génération d'objets request/response basés sur un fichier WSDL donné peut être automatisée en utilisant des plugins Maven. Le plugin utilisé par les exemples Spring-WS est le maven-jaxb2-plugin.

WebServiceTemplate est toujours la classe de base pour l'accès aux services web côté client. Pour plus d'informations, vous pouvez consulter ce exemple détaillé sur la façon de consommer un service web en utilisant Spring-WS à partir d'un fichier WSDL que j'ai écrit.

0
répondu CodeNotFound 2017-02-27 21:53:25