Tabla de Contenidos

Anotaciones JAX-WS para crear servicios web

PEDRO DELGADO YARZA 2014/02/13 14:00

Con FundeWeb resulta posible generar un servicio web e invocar un servicio web con anotaciones proporcionadas por la pila de servicios JAX-WS, para una fácil configuración y despliegue de servicios web.

Para ello vamos a repasar las anotaciones de las que disponemos para poder crear nuestro servicio web desde cero a partir de nuestras clases Java ya creadas.

Anotaciones

@WebService: Utilizada para especificar que la clase que la contiene ha de convertirse en un servico web. Sus propiedades son:

@WebService(targetNamespace = "urn:atica:cursosoa:services:conversordivisa", name = "ConversorDivisa")
@XmlSeeAlso({ObjectFactory.class})
public interface ConversorDivisa { ... }
 
@WebService( serviceName = "ConversorDivisa",
             portName = "ConversorDivisaSOAP",
             targetNamespace = "urn:atica:cursosoa:services:conversordivisa",
             wsdlLocation = "WEB-INF/wsdl/ConversorDivisa.wsdl",
             endpointInterface = "org.umu.atica.wservices.ConversorDivisa")
 
public class ConversorDivisaImpl implements ConversorDivisa { ... }

@WebMethod: Situada sobre un método de nuestro código, se utiliza para exponer esa operación en el servicio web.

@WebParam: Situada dentro de los parámetros de un método de nuestro código se utiliza para personalizar el mapeo de un parámetro concreto, entre el dato que se expone en el servicio y con el tipo java correspondiente. Sus principales propiedades son:

@WebResult: Situada sobre un método de nuestro código, se utiliza para personalizar el mapeo del resultado de dicho método. Sus principales propiedades son:

@RequestWrapper: Situado en la cabecera de un método indica la clase Java que mapea la petición del servicio web para ese método. Sus principales propiedades son:

A continuación mostramos un ejemplo completo de la definición de un método con los parámetros anteriores:

@WebResult(name = "ValorCambio", targetNamespace = "")
    @RequestWrapper(localName = "ObtenCambio", targetNamespace = "urn:atica:cursosoa:services:conversordivisa", className = "org.umu.atica.wservices.ObtenCambio")
    @WebMethod(operationName = "ObtenCambio", action = "urn:atica:cursosoa:services:conversordivisa/ObtenCambio")
    @ResponseWrapper(localName = "ObtenCambioResponse", targetNamespace = "urn:atica:cursosoa:services:conversordivisa", className = "org.umu.atica.wservices.ObtenCambioResponse")
    public double obtenCambio(
        @WebParam(name = "MonedaOrigen", targetNamespace = "")
        org.umu.atica.wservices.MonedaType monedaOrigen,
        @WebParam(name = "MonedaDestino", targetNamespace = "")
        org.umu.atica.wservices.MonedaType monedaDestino
    );

Definición del servicio web

En primer lugar debemos una interfaz con las anotaciones necesarias para utilizar un EJB como un servicio web.

@WebService(targetNamespace = "urn:atica:cursosoa:services:conversordivisa", name = "ConversorDivisa")
@XmlSeeAlso({ObjectFactory.class})
public interface ConversorDivisa {
 
    @WebResult(name = "ValorCambio", targetNamespace = "")
    @RequestWrapper(localName = "ObtenCambio", targetNamespace = "urn:atica:cursosoa:services:conversordivisa", className = "org.umu.atica.wservices.ObtenCambio")
    @WebMethod(operationName = "ObtenCambio", action = "urn:atica:cursosoa:services:conversordivisa/ObtenCambio")
    @ResponseWrapper(localName = "ObtenCambioResponse", targetNamespace = "urn:atica:cursosoa:services:conversordivisa", className = "org.umu.atica.wservices.ObtenCambioResponse")
    public double obtenCambio(
        @WebParam(name = "MonedaOrigen", targetNamespace = "")
        org.umu.atica.wservices.MonedaType monedaOrigen,
        @WebParam(name = "MonedaDestino", targetNamespace = "")
        org.umu.atica.wservices.MonedaType monedaDestino
    )
 
    ...
 
  }

Tras ello definimos la clase que implementará la interfaz.

WebService( serviceName = "ConversorDivisa",
            portName = "ConversorDivisaSOAP",
            targetNamespace = "urn:atica:cursosoa:services:conversordivisa",
            wsdlLocation = "WEB-INF/wsdl/ConversorDivisa.wsdl",
            endpointInterface = "org.umu.atica.wservices.ConversorDivisa")
 
public class ConversorDivisaImpl implements ConversorDivisa {
 
    private static final Logger LOG = Logger.getLogger(ConversorDivisaImpl.class.getName());
 
    public double obtenCambio(org.umu.atica.wservices.MonedaType monedaOrigen,org.umu.atica.wservices.MonedaType monedaDestino) { 
        LOG.info("Executing operation obtenCambio");
        try {
           ...
           ...
        } catch (java.lang.Exception ex) {
           ...
        }
    }
    ... 
}

Por último debemos asegurarnos que en el fichero components.xml tenemos habilitado el contexto para el servicio web, en nuestro caso sería este:

   <web:context-filter url-pattern="/services/*" />