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
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
- 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
Basado en SCDJWS 5: Study Notes de Ivan Krizsan
Publicar un comentario