Desarrollo de servicios web JAX-WS con anotaciones
JAX-WS (API de Java™ para servicios web basados en XML) soporta dos tipos distintos de implementación de punto final de servicio, la interfaz estándar de punto final de servicio web y una interfaz de proveedor nueva para que los servicios funcionen en el nivel de mensajes XML. Al utilizar anotaciones en la implementación de punto final o de cliente de servicio, puede definir el punto final de servicio como un servicio web.
Antes de empezar
Configuración de un entorno de desarrollo para servicios web.
Acerca de esta tarea
Esta tarea es un paso necesario para desarrollar servicios web JAX-WS.
La tecnología JAX-WS soporta la implementación de servicios web basados en la interfaz estándar de punto final de servicio y en la nueva interfaz de proveedor. Los puntos finales JAX-WS son similares a las implementaciones de punto final de la especificación JAX-RPC (API de Java para RPC basado en XML). A diferencia de JAX-RPC, el requisito para una interfaz de punto final de servicio (SEI) es opcional para los servicios web JAX-WS. Los servicios JAX-WS que no tienen una SEI asociada se considera que tienen una SEI implícita, mientras que los servicios que tienen una SEI asociada se considera que tienen una SEI explícita. Las interfaces de punto final de servicio requeridas por JAX-WS también son más genéricas que las interfaces de punto final de servicio requeridas por JAX-RPC. Con JAX-WS, la SEI no es necesaria para ampliar la interfaz java.rmi.Remote, tal como requiere la especificación JAX-RPC.
El modelo de programación JAX-WS también utiliza el soporte de anotación de clases Java con metadatos para definir una implementación de punto final de servicio como un servicio web y definir el modo en que un cliente puede acceder al servicio web. JAX-WS da soporte a las anotaciones en función del recurso de metadatos para la especificación Java Programming Language (JSR 175), los metadatos de servicios web para la especificación Java Platform (JSR 181) y las anotaciones definidas por la especificación JAX-WS 2.0 (JSR 224), entre las que se incluyen las anotaciones de JAXB (arquitectura Java para enlaces XML). Mediante el uso de anotaciones, la implementación de punto final de servicio pueden describir independientemente el servicio web sin requerir un archivo WSDL. Las anotaciones pueden proporcionar toda la información necesaria de WSDL para configurar la implementación de punto final de servicio o el cliente de servicios web. Puede especificar anotaciones sobre la interfaz de punto final de servicio utilizada por el cliente y el servidor, o sobre la clase de implementación de servicio en el lado del servidor.
Para obtener más información sobre los estándares y las especificaciones soportados, consulte las especificaciones de servicios web y la documentación de la API.
Cuando desarrolle un servicio web JAX-WS a partir de clases Java existentes, lo que se conoce como el método ascendente, debe anotar la clase con la anotación @WebService (javax.jws.WebService) o la anotación @WebServiceProvider (javax.xml.ws.Provider) para definir inicialmente la clase como un servicio web. La anotación @WebService define el servicio como un punto final basado en SEI, mientras que la anotación @WebServiceProvider define el servicio como un punto final basado en el proveedor.
- Desarrollo de servicios web JAX-WS basados en SEI
Para un punto final basado en SEI, la interfaz de punto final de servicio (SEI), tanto si se trata de una clase Java como de una interfaz Java, declara los métodos de negocio proporcionados por un servicio web concreto. Los únicos métodos que puede invocar un cliente de servicios web en un punto final JAX-WS son los métodos empresariales definidos en la SEI explícita o implícita.
Todos los puntos finales basados en SEI deben tener la anotación @WebService incluida en la clase de implementación. Si la implementación del servicio utiliza una SEI explícita, el atributo endpointInterface de la anotación @WebService debe hacer referencia a dicha interfaz. Si la implementación del servicio no utiliza una SEI explícita, el servicio se describe implícitamente mediante la clase de implementación y es una SEI implícita.
- Desarrollo de servicios web JAX-WS utilizando la interfaz de proveedor
El modelo de programación JAX-WS presenta la interfaz de proveedor para los puntos finales de proveedor, javax.xml.ws.Provider, como alternativa dinámica a los puntos finales basados en SEI. La interfaz de proveedor soporta un enfoque de los servicios web más orientado a la mensajería. Con la interfaz de proveedor, puede crear una clase Java que implemente una única interfaz para producir una clase de implementación de servicio genérica. La interfaz de proveedor define un método, el método invoke, que utiliza valores genéricos para controlar tanto los tipos de entrada, como de salida, cuando se trabaja con varios mensajes o varios datos de carga de mensajes. Todos los puntos finales de proveedor se deben anotar con la anotación @WebServiceProvider (javax.xml.ws.WebServiceProvider). Una implementación de servicio no puede especificar la anotación @WebService si implementa la interfaz javax.xml.ws.Provider.
A partir de WebSphere Application Server versión 7.0 y posterior, los módulos de aplicación Java EE 5 (los módulos de la aplicación web de la versión 2.5 o superior, o los módulos EJB de versión 3.0 o superior) se examinan para ver anotaciones para identificar los servicios y clientes JAX-WS. Sin embargo, los módulos de aplicaciones anteriores a Java EE 5 (módulos de aplicaciones web versión 2.4 o anteriores o módulos EJB versión 2.1 o anteriores) no se exploran para ver si contienen anotaciones JAX-WS, de manera predeterminada, por razones de rendimiento. En el paquete de características de la versión 6.1 para servicios Web, el comportamiento predeterminado es explorar los módulos de aplicaciones Web anteriores a Java EE 5 para identificar los servicios JAX-WS y explorar los módulos de aplicaciones web anteriores a Java EE 5 y los módulos EJB en busca de clientes de servicio durante la instalación de aplicaciones. Puesto que el comportamiento predeterminado de WebSphere Application Server Versión 7.0 y posteriores es no explorar módulos anteriores a Java EE 5 en busca de anotaciones durante la instalación de aplicaciones o el arranque de servidor, para conservar la compatibilidad con los releases anteriores del paquete de características, deberá configurar la propiedad UseWSFEP61ScanPolicy en META-INF/MANIFEST.MF de un archivo archivador web (WAR) o un módulo EJB o definir la propiedad personalizada de máquina virtual Java, com.ibm.websphere.webservices.UseWSFEP61ScanPolicy, en los servidores para solicitar la exploración durante la instalación de aplicaciones y el arranque de servidor. Para obtener más información sobre la exploración de anotaciones, consulte la información sobre las anotaciones de JAX-WS.
Procedimiento
Resultados
Ha definido la implementación de punto final de servicio que representa la aplicación de los servicios web. Consulte la documentación de las anotaciones JAX-WS para obtener más información acerca de las anotaciones JAX-WS soportadas.
Interfaz e implementación de punto final de servicio JavaBeans de ejemplo
/**
Este es un extracto del archivo de implementación de servicio, EchoServicePortTypeImpl.java.
package com.ibm.was.wssample.echo;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import javax.xml.transform.stream.StreamSource;
@javax.jws.WebService(serviceName = "EchoService", endpointInterface =
"com.ibm.was.wssample.echo.EchoServicePortType", targetNamespace="http://com/ibm/was/wssample/echo/",
portName="EchoServicePort")
public class EchoServicePortTypeImpl implements EchoServicePortType {
public EchoServicePortTypeImpl() {
}
public String echo(String obj) {
String str;
....
str = obj;
....
return str;
}
}
/** Se trata de un ejemplo de interfaz de servicio EchoServicePortType.java. */
import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.xml.ws.*;
@WebService(name = "EchoServicePortType", targetNamespace = "http://com/ibm/was/wssample/echo/",
wsdlLocation="WEB-INF/wsdl/Echo.wsdl")
public interface EchoServicePortType {
/** ...el proceso de método ...*/
@WebMethod
}
package jaxws.provider.source;
import javax.xml.ws.Provider;
import javax.xml.ws.WebServiceProvider;
import javax.xml.transform.Source;
@WebServiceProvider()
public class SourceProvider implements Provider<Source> {
public Source echo(Source data) {
return data;
}
}
En la implementación del proveedor de ejemplo, se especifica el tipo javax.xml.transform.Source en el método <Source> genérico. El método <Source> genérico especifica que tanto los tipos de entrada, como de salida son objetos Source.
Qué hacer a continuación
Desarrollo de artefactos Java para aplicaciones JAX-WS a partir de JavaBeans. Para obtener más información, consulte la generación de artefactos Java para aplicaciones JAX-WS.