@WebServiceProvider

(Imagen: Rembrandt - La partida del arcángel)

Un web service puede procesar mensajes de protocolo (por lo general SOAP) o payloads de un mensaje (para SOAP, los contenidos del elemento body de un mensaje SOAP). Un Web Service de esta naturaleza debe implementar la interfaz javax.xml.ws.Provider ser anotada con @WebServiceProvider. Veamos como se ve uno de estos Web Services:





package com.ivan;

@WebServiceProvider(
wsdlLocation="StringProcessorService.wsdl",
portName="StringProcessorServicePort",
serviceName="StringProcessorService",
targetNamespace="http://www.ivan.com/stringprocessor"
)
@ServiceMode (value=Service.Mode.PAYLOAD)
@SOAPBinding(
parameterStyle=SOAPBinding.ParameterStyle.WRAPPED,
style = SOAPBinding.Style.DOCUMENT,
use = SOAPBinding.Use.LITERAL
)

public class StringProcessor implements Provider{
public Source invoke (final Source inRequestMessage){
Source theResponseSource = null;
try{
JAXBContext theJaxbContext = JAXBContext.newInstance("com.ivan.beans");
Unmarshaller theUnmarshaller = theJaxbContext.createUnmarshaller();
Marshaller theMarshaller = theJaxbContent.createMarshaller();

JAXBElement theReqElem = (JAXBElement)theUnmarshaller.unmarshall(inRequestMessage);
ReverseStringReq theReq = theReqElem.getValue();

String theResultString = (new StringBuffer(theReq.getString())).reverse().toString();
ObjectFactory theObjFactory = new ObjectFactory();
ReverseStringResp theResponse = theObjFactory.createReverseStringResp();
theResponse.setReturn(theResultString);

theResponseSource = new JAXBSource(theJaxbContext, theResponse),
}catch (JAXBException theException){
theException.printStackTrace();
}
return theResponseSource;
}
}

Antes de empezar esto, es necesario decir que contábamos con el Schema Definition (StringProcessorService_payloads.xsd) y el documento WSDL (StringProcessorService.wsdl). Con estos archivos y la herramienta XJC hemos creado las siguientes clases Java, necesarias para el trabajo con JAXB:

  • ObjectFactory.java
  • package-info.java
  • ReverseStringReq.java
  • ReverseStringResp.java

Habiendo dicho esto, proseguimos.

La anotación @WebServiceProvider se utiliza cuando la clase service endpoint implementa la interfaz Provider. Como se ve, la clase de arriba no contiene métodos a ser expuestos como operaciones de Web Service, sino sólamente el método invoke. El método invoke será "invocado" cada vez que el web service reciba un request y el mensaje de protocolo - o el payload del mensaje- serán enviados como parámetros al método invoke.

La anotación @ServiceMode nos indica si la clase provider recibirá y producirá mensajes de protocolo completos o sólamente los payloads. En el ejemplo, se opta por lo segundo.

La anotación @SOAPBinding nos dice lo siguiente:

  • Messaging style: style = SOAPBinding.Style.DOCUMENT
  • Encoding: use = SOAPBinding.Use.LITERAL
  • ParameterStyle: parameterStyle = SOAPBinding.ParameterStyle.WRAPPED

Los valores de arriba son los valores por defecto, así que podríamos haber omitido la anotación.

Al declarar la clase provider:

public class StringProcessor implements Provider

Las clases Service Endpoint deben implementar la interfaz javax.xml.ws.Provider, para permitirles el recibir y procesar mensajes de protocolo o payloads de mensaje. La especificación JAX-WS da soporte a los siguientes providers:

  • Provider En el modo Payload de mensaje. La interfaz Source es implementada por las siguientes clases: DOMSource, JAXBSource, SAXSource, StaxSource, StreamSource
  • Provider En modo mensaje
  • Provider

En lo referente a la clase Provider, se establecen también las siguientes restricciones:

  • Las clases Provider deben implementar el constructor por defecto, o no implementar ninguno.
  • Una clase provider debe estar ligada a un tipo específico. No se puede implementar Provider
  • Una clase provider debe estar anotada con @WebServiceProvider

Publicar un comentario