Web Services con Java (JAX-WS)

ReflectionToStringBuilderLos Web Services cada vez son más indispensable a la hora de construir aplicaciones, debido a que ya casi cualquier aplicación empresarial, requiere integrarse o comunicarse con otra. Por este motivo Java ofrece la librería JAX-WS la cual es definida por la especificación JSR 224. La especificación remplace a la JAX-RCP, la cual era únicamente para llamadas a procedimientos remotos, lo cual es diferente a los Web Services.

 

Crear Web Services con Java es mucho más fácil de lo que pudiéramos creer, pues ya que tan solo es necesario anotar una clase, para que esta sea expuesta automáticamente como tal por medio del servidor de aplicaciones. Para demostrar esto, desarrollaremos un Servicio para consultar y crear Empleados.

 

Lo primero que tenemos que hacer, es crear una clase que queremos exponer como WebService, luego la tenemos que anotar con @WebService :

Las propiedades utilizadas son las siguientes:

  • serviceName: Nombre del servicio, que será utilizado para crear la URL del endpoint.
  • targetNamespace: Define el Namespace del servicio.

 

Basta decir que las propiedades serviceName  y targetNamespace  son opcionales, ya que, de no colocarlas, serán asignadas de forma automática, tomando el nombre de la clase y el paquete en que se encuentra respectivamente.

 

En segundo lugar, es necesario crear los métodos que serán expuestos como las operaciones del WebService, estos métodos, deben de ser anotados con @WebMethod , veamos cómo quedaría una clase WebService terminada:

 

La anotación @WebParam  es utilizado para personalizar el nombre del parámetro en el WSDL.

 

La definición de la clase Employee es la siguiente:

 

Finalmente, solo serán necesario deployar en el servidor de aplicaciones nuestro proyecto, en este caso, estamos utilizando Wildfly 9, pero podrías utilizar cualquier servidor que sea de tu preferencia. Una vez deployado, podrás ver el servicio en la URL: http://localhost:8080/JAX-WS-1.0-SNAPSHOT/EmployeeService?wsdl.

 

Podemos probar el servicio con SOAP-UI para ver el servicio y las dos operaciones:

Web Services con Java

 

Observemos que tenemos dos operaciones:

  • createEmployee: nos permite crear un nuevo Empleado
  • getEmployeeList: obtener un listado de todos los Empleados registrados.

 

Primeo ejecutaremos el método createEmployee:

Web Services con Java

Con este paso, ya habremos creado un nuevo Empleado llamado Oscar Blancarte.

 

El segundo paso, será consultar los empleados con el método getEmployeeList:

Web Services con Java

 

Como vemos, crear Servicios Web es tan simple como anotar una simple clase y desplegarla en nuestro servidor de aplicaciones.

 

 

Artículos relacionados

Que es el Polimorfismo? Si son nuevos en la programación seguramente esta palabra les causar dolor de cabeza ya que desde mi punto de vista esta es la caracterizara del parad...
SOAP vs REST ¿cual es mejor? SOAP vs REST es una comparación que muchos programadores o incluso arquitectos de software suelen preguntarse a la hora de desarrollar las API para su...
Java Message Service (JMS) En este Post se habla hacer de la especificación de JMS, los patronos de entrega de manejes que soporta como lo son Punto a Punto(P2P) y Publicador/Su...

Oscar Blancarte

Ideológico, Innovador y emprendedor, Padre, Tecnólogo y Autor, amante de la ciencia y la tecnología en todos sus colores y sabores. Arquitecto de software & Full Stack Developer con experiencia en la industria del desarrollo de software y la consultoría. Amante de la programación y el Ajedrez.

22 comentarios en “Web Services con Java (JAX-WS)

  1. Hola me encanto tu articulo oye tengo una duda ojala me pudieras ayudar, soy nuevo en java y creé un servicio web utilizando net beans y tengo algunas clases con metodos para hacer algunas operaciones y esos metodos me regresan parametros por lo general tipo cadena en su mayoria el problema es que en algunos metodos creo algunos objetos para ejecutar metodos de otras clases pero el servicio web no hace nada es decir envio el parametro (texto ) recibido del cliente y se va hacia los metodos y no hace nada no me da ningun resultado
    solo se ejcuta el servicio pero no hace nada y ya lo estuve revisando y si funciona correctamente hasta que escribo la instruccion para crear un objeto.

    1. Hola Charly, tu pregunta es complicada de responder, pues probablemente sea un escenario muy concreto de tu desarrollo, pues en teoría, esto que comentas no debería tener un impacto sobre tu desarrollo.

  2. Hola excelente tu post me ayudó bastante porque estoy haciendo un service web para una empresa de impuestos.

    Ahora mis dudas son:

    Como puedo arrojar una excepción si un @WebParam está nulo o no tiene la información esperada, además que esos @WebParam aparezca en el wsdl de la aplicación cómo parámetros obligatorios.

    Tengo que implementar seguridad usando , donde lo colocaría para que si el usuario no existe o no sea válido no llame a un webservice.

    Gracias

    1. Hola Jairo, gracias por tu comentario.

      Con respecto al primer punto que mencionas, para marcar un campo como obligatorio, deberás usar las anotaciones de JAXB, la cual es un API especial para controlar la forma en que un Objeto se convierte en XML y como el XML se convierte en objetos. Internamente Java usa JAXB para convertir el request en un objeto Java, de la misma forma, usa JAXB para convertir el objeto de respuesta en un XML, lo que tienes que hacer es darle una revisada a la documentación de esta API, como resumen te podría decir que uses la anotación @XmlElement(name = "xxx", required = true) sobre el elemento que quieres marcar como requerido, donde el atributo required le indica a JAXB que el campo deberá ser obligatorio, y por consecuencia, el WSLD lo debería de marcar como tal.
      Con respecto a la validacón, hay varias formas, podrías validar el input contra el Schema, validar manualmente cada campo mediante condiciones, podrías usar el API de Bean Validator, etc, en realidad hay varias formas, todo dependerá de que tan sofisticado quieres que sean tus validaciones y claro el tiempo que tengas para implementarlas.

      Con respecto a lo de la seguridad, creo que no terminaste la oración, por que dice “Tengo que implementar seguridad usando”, pero no dices que estás usando.

      1. Hola gracias por responder.

        Se borró la parte que describía la autenticación que debe usar UsernameToken (username y password),

        leere la parte del @XmlElement, tienes algún libro que describa con facilidad y ejemplos de uso de las anotaciones?

        Saludos.

        1. lo de la autenticación es algo largo para explicarlo aquí, pero te puedo recomendar la siguiente liga, en donde lo explican muy bien: https://java.globinch.com/enterprise-java/web-services/jax-ws/secure-metro-jax-ws-usernametoken-web-service-signature-encryption/

          Con respecto al libro sobre JAXB, existen libros que lo cubren pero no es el tema central, mi recomendación es que busques en google documentación, esta es un API bastante fácil de aprender, sobre todo si lo necesitas para realizar algunas anotaciones simples.

          Como un tema adicional, te puedo recomendar mi libro de Aplicaciones reactivas con React, NodeJS & MongoDB, en el explico como crear un API REST con NodeJS y te enseño a usar la autenticación por medio de JSON Web Tokens (JWT), ademas de que aprenderás React y MongoDB, que son tecnologías altamente demandadas y pagas hoy en día por si estas interesado.

  3. Sumamente simple y la manera más fácil de construir un Web Services, sin ccomplicarse con tantos frameworks. Claro que depende bastante del proyecto. MUCHAS GRACIAS camarada. 🙂

    1. Hola Andres, por desgracia no conozco manuales en español, lo que sí, es que te puedo recomendar el libro “Java Web Services – Up and running”, yo lo compre hace unos años, pero está muy bueno, explica todo lo referente a la construcción de servicios con Java, el único problema es que está en Ingles.

      saludos.

  4. Debo Felicitarte, desde hace días estoy buscando como utilizar el JAX-WS, he visto muchos tutoriales y ninguno explica claramente que debe ir dentro del Web Service y lo explicaste de maravilla con el ejemplo. Me funcionó con tu ejemplo.
    Para hacer el cliente debo exportar el wsdl? y hacer un main para probarlo es así?
    Saludos y gracias

    1. Hola Andrea, el WSDL se genera en automático, solo agrega ?wsdl al final de la url del servicio. Para crear un cliente basado en un servicio existente te puedes apoyar del IDE, siempre tienen herramientas para crearlos, de otro modo, puedes utilizar la herramienta WSGEN que ya viene incluida en el JDK, piedes googlerar para entender como utilizarla

  5. Buenas, queria hacer una consulta en particual. Tengo desarrollado un conjunto de agentes inteligenten con la librearia JADE, realizado en IDE Netbeans. Mi consulta consiste en, ¿cómo puedo implementar estos agentes en un web service?, para que luego, pueda ser utilizado por medio de una aplicación móvil, desarrollado con Android. Espero tu respuesta, muy buena publicación.

    1. Hola, yo no implementaría estos Agentes como WebServices, en su lugar, crearía una capa de servicios que envuelva lo que ya tienes, por ejemplo, puedes crear un proyecto aparte que exponga únicamente los servicios y estos se conecten a tus agentes. De esta forma, no impactas a tus agentes y puedes exponerlo por internet 🙂

        1. Hola Oscar, lo que me comentas no me hace mucho sentido, pues el nombre del prefijo no debería de afectar la forma en que consumes el servicio, lo único que podría afectarte en tal caso, es que el namespace asociado al prefijo fuera diferente al esperado, lo cual no creo, pues el Envolope es auto generado por el API de JAX-WS.

          Ahora bien, si aun así quieres editarlo, te podrías presentar ante dos escenarios, invocar el servicio por medio de las clases Bindings (Auto generados por JAX-WS), o invocar los servicio por medio de bajo nivel.
          En el primer caso, no podrás hacer nada, pues JAX-WS se encarga de generar el envoltorio (Envelope), por lo que lo único que podrías afectar es el payload. En el otro caso, tendrás que sobre escribir los namespace con el API de JAXB. No recuerdo los detalles de implementación de JAXB para hacer esto, por lo que te sugiero que te des una vuelta por Google.

          Espero que esto puedo ayudarte.

          1. Te explico mi problema, el request que espero es el siguiente:

            string
            boolean

            Y el request que se genera en mi WS es este:

            ?
            ?

            Por lo que me dices, la petición no ella a mi WS debido a que me llega xmlns:soap y yo espero xmlns:temp, ¿como puedo modificar esa parte?, para yo esperar el xmlns:soap.

            Saludos.

          2. Hola Oscar, en el comentario anterior te explique los dos casos que se te podrían presentar, y te comenté que no recuerdo los detalles de implementación, y realmente no tengo tiempo para adentrarme a analizarlos para darte la respuesta definitiva, con las pistas que te dí, deberías de poder buscar en google una solución al problema.

            Lamento no poder hacer nada más, pero realmente no tengo tiempo para analizar detalladamente tu error.
            saludos.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *