mkyong - spring-ws example
Consumir el servicio de servicio web en SPRING-WS usando wsdl (3)
Tengo WSDL conmigo .eg: / sample / hello? Wsdl. Quiero invocar el servicio webservice configurando en Spring-ws. Pasé este wsdl como parámetro a las etiquetas en springconfig.xml. ¿Puede alguien decirme cómo consumir este servicio web en Spring-ws?
1. Configurar dependencias de proyectos.
agrega las siguientes dependencias al archivo 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. Configurar contexto de aplicación de servicio 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. Configure clases modelo que se asignarían a sus objetos de solicitud / respuesta SOAP
Por ejemplo, si su solicitud de XML de SOAP parecía
<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>
y su XML de respuesta SOAP parecía:
<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>
las clases correspondientes (en el paquete que especificó en el bean marshaller: com.yourcompany.model) serían respectivamente:
@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;
}
}
y
@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. Agregue una Fábrica de objetos (en el paquete com.yourcompany.model) para crear objetos de solicitud / respuesta
@XmlRegistry
public class ObjectFactory {
public ObjectFactory() {
}
public InputParameters createYourRequest() {
return new InputParameters();
}
public OutputParameters createYourResponse() {
return new OutputParameters();
}
}
5. Crea un cliente para consumir el servicio.
Interfaz:
public interface YourService {
BigDecimal getValue(String paramOne);
}
Implementación
@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();
}
}
Dado que esta pregunta aún está activa, pensé que publicaría una actualización que refleja una serie de cambios que la versión reciente del marco de Spring Web Services y Spring en general introducen:
- La introducción de Spring Boot permite aprovechar los POM ''iniciales'' para simplificar la configuración de Maven. Hay un
spring-boot-starter-web-services
específico para Spring-WS - En lugar de especificar los archivos de configuración de Spring utilizando XML, se introdujo Spring JavaConfig, que proporciona una opción de Java puro y segura para la configuración de Spring.
- La generación de objetos de solicitud / respuesta basados en un archivo WSDL determinado puede automatizarse utilizando los complementos de Maven. El complemento utilizado por los ejemplos de Spring-WS es el
maven-jaxb2-plugin
.
WebServiceTemplate
sigue siendo la clase principal para el acceso al servicio web del lado del cliente. Para obtener más información, puede consultar este ejemplo detallado sobre cómo consumir un servicio web utilizando Spring-WS a partir de un archivo WSDL que escribí.
La respuesta de @Taoufik Mohdit está completa !!
Para construir los objetos de entrada y salida, puede usar el servicio web-cliente: ¿Un enfoque común con Spring WS, JAXB y solo un archivo WSDL? a algunos cómo construir estos objetos automáticamente