Servicios web con EJB3 y JAX-WS

Los web services al uso (con SOAP, XML y todas esas chupi-tecnologías) nunca me han gustado. Siempre lo he encontrado complicado de utilizar, mal documentado, poco interoperable... la verdad es que siempre me he decantado más por servicios REST usando JSON como transporte de datos. En cualquier caso muchas veces no tenemos el lujo de poder elegir, así que para publicar fácilmente un servicio web en una aplicación Java EE lo tenemos un poco más facil.

Generar un servicio web en un servidor EJB 3 es muy fácil usando JAX-WS y anotaciones.Partimos de un stateless session bean. Sólo hay que añadir la anotación @WebService a la clase y @WebMethod a los métodos que queramos publicar. Por ejemplo:

@WebService()
public class Hello {  
 private String message = new String("Hello, ");

 public void Hello() {}

 @WebMethod()
 public String sayHello(String name) {
   return message + name + ".";
 }
}

Esto publicará el servicio web automáticamente. La URL será probablemente (triste, pero no está definido por el estándar) el nombre de la clase seguido de "Service" y el nombre de la clase de nuevo. En este ejemplo: http://servidor/HelloService/Hello . Normalmente los logs del servidor se muestra la URL. En el caso del GlassFish también se puede consultar por la consola web de administración.

Poniendo nombre a los parámetros

Si queremos cambiar los nombres de los parámetros en el WSDL (cosa puramente estética) podemos anotarlos al código:

@WebMethod
 public List<Proveedor> consultaProveedores(@WebParam(name = "cliente") IdGlobal idCliente,
@WebParam(name ="almacenOrigen") short almacenOrigen) {
   ...
}