Introducción a JAX-WS

1. Información general

La API de Java para servicios web XML (JAX-WS) es una API estandarizada para crear y consumir servicios web SOAP (Protocolo simple de acceso a objetos).

En este artículo, crearemos un servicio web SOAP y nos conectaremos a él mediante JAX-WS.

2. JABÓN

SOAP es una especificación XML para enviar mensajes a través de una red. Los mensajes SOAP son independientes de cualquier sistema operativo y pueden utilizar una variedad de protocolos de comunicación, incluidos HTTP y SMTP.

SOAP es XML pesado, por lo tanto, se usa mejor con herramientas / marcos. JAX-WS es un marco que simplifica el uso de SOAP. Es parte del estándar Java.

3. De arriba hacia abajo frente a de abajo hacia arriba

Hay dos formas de crear servicios web SOAP. Podemos optar por un enfoque de arriba hacia abajo o un enfoque de abajo hacia arriba.

En un enfoque de arriba hacia abajo (primero el contrato), se crea un documento WSDL y las clases Java necesarias se generan a partir del WSDL. En un enfoque ascendente (último contrato), las clases de Java se escriben y el WSDL se genera a partir de las clases de Java.

Escribir un archivo WSDL puede ser bastante difícil dependiendo de la complejidad de su servicio web. Esto hace que el enfoque de abajo hacia arriba sea una opción más sencilla. Por otro lado, dado que su WSDL se genera a partir de las clases de Java, cualquier cambio en el código podría provocar un cambio en el WSDL. Este no es el caso del enfoque de arriba hacia abajo.

En este artículo, veremos ambos enfoques.

4. Lenguaje de definición de servicios web (WSDL)

WSDL es una definición de contrato de los servicios disponibles. Es una especificación de mensajes de entrada / salida y cómo invocar el servicio web. Es un lenguaje neutro y está definido en XML.

Veamos los elementos principales de un documento WSDL.

4.1. Definiciones

El elemento de definiciones es el elemento raíz de todos los documentos WSDL. Define el nombre, el espacio de nombres, etc. del servicio y, como ves, puede ser bastante espacioso:

 ... 

4.2. Tipos

El elemento de tipos define los tipos de datos utilizados por el servicio web. WSDL usa XSD (Definición de esquema XML) como el sistema de tipos que ayuda con la interoperabilidad:

 ...      ... 

4.3. Mensajes

El elemento de mensaje proporciona una definición abstracta de los datos que se transmiten. Cada elemento de mensaje describe la entrada o salida de un método de servicio y las posibles excepciones:

 ...          ... 

4.4. Operaciones y tipos de puertos

El elemento portType describe cada operación que se puede realizar y todos los elementos del mensaje involucrados. Por ejemplo, la operación getEmployee especifica la entrada de la solicitud , la salida y la posible excepción de falla lanzada por la operación del servicio web :

 ...       ....  ...  

4.5. Fijaciones

El elemento de enlace proporciona detalles de formato de datos y protocolo para cada tipo de puerto :

 ...               ...  ... 

4.6. Servicios y Puertos

El elemento de servicio define los puertos admitidos por el servicio web. El elemento de puerto en servicio define el nombre , el enlace y la dirección del servicio:

 ...      ... 

5. Enfoque de arriba hacia abajo (primero el contrato)

Comencemos con un enfoque de arriba hacia abajo creando un archivo WSDL employeeervicetopdown.wsdl. En aras de la simplicidad, solo tiene un método:

5.1. Generación de archivos fuente de servicios web desde WSDL

Hay varias formas de generar archivos de origen de servicios web a partir de un documento WSDL.

Una forma es usar la herramienta wsimport que es parte de JDK (en $ JAVA_HOME / bin) hasta JDK 8.

Desde el símbolo del sistema:

wsimport -s . -p com.baeldung.jaxws.server.topdown employeeservicetopdown.wsdl

Opciones de línea de comando utilizadas: -p especifica el paquete de destino. -s especifica dónde colocar los archivos fuente generados.

Para versiones posteriores de JDK, podemos usar jaxws-maven-plugin de MojoHaus como se describe aquí.

Alternativamente, org.jvnet.jaxb2 's experto-jaxb2-plugin puede ser útil como se detalla en la invocación de un servicio Web SOAP en primavera.

Los archivos generados:

  • EmployeeServiceTopDown.java : es la interfaz de punto final de servicio (SEI) que contiene definiciones de métodos
  • ObjectFactory.java : contiene métodos de fábrica para crear instancias de clases derivadas de esquemas mediante programación
  • EmployeeServiceTopDown_Service.java : es la clase de proveedor de servicios que puede utilizar un cliente JAX-WS

5.2. Interfaz de punto final de servicio web

La herramienta wsimport ha generado la interfaz de punto final de servicio web EmployeeServiceTopDown . Declara los métodos del servicio web:

@WebService( name = "EmployeeServiceTopDown", targetNamespace = "//topdown.server.jaxws.baeldung.com/") @SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE) @XmlSeeAlso({ ObjectFactory.class }) public interface EmployeeServiceTopDown { @WebMethod( action = "//topdown.server.jaxws.baeldung.com/" + "EmployeeServiceTopDown/countEmployees") @WebResult( name = "countEmployeesResponse", targetNamespace = "//topdown.server.jaxws.baeldung.com/", partName = "parameters") public int countEmployees(); }

5.3. Implementación de servicios web

La herramienta wsimport ha creado la estructura del servicio web. Tenemos que crear la implementación del servicio web:

@WebService( name = "EmployeeServiceTopDown", endpointInterface = "com.baeldung.jaxws.server.topdown.EmployeeServiceTopDown", targetNamespace = "//topdown.server.jaxws.baeldung.com/") public class EmployeeServiceTopDownImpl implements EmployeeServiceTopDown { @Inject private EmployeeRepository employeeRepositoryImpl; @WebMethod public int countEmployees() { return employeeRepositoryImpl.count(); } }

6. Enfoque de abajo hacia arriba (último contrato)

En un enfoque ascendente, tenemos que crear tanto la interfaz de punto final como las clases de implementación. El WSDL se genera a partir de las clases cuando se publica el servicio web.

Let's create a web service that will perform simple CRUD operations on Employee data.

6.1. The Model Class

The Employee model class:

public class Employee { private int id; private String firstName; // standard getters and setters }

6.2. Web Service Endpoint Interface

The web service endpoint interface which declares the web service methods:

@WebService public interface EmployeeService { @WebMethod Employee getEmployee(int id); @WebMethod Employee updateEmployee(int id, String name); @WebMethod boolean deleteEmployee(int id); @WebMethod Employee addEmployee(int id, String name); // ... }

This interface defines an abstract contract for the web service. The annotations used:

  • @WebService denotes that it is a web service interface
  • @WebMethod is used to customize a web service operation
  • @WebResult is used to customize name of the XML element that represents the return value

6.3. Web Service Implementation

The implementation class of the web service endpoint interface:

@WebService(endpointInterface = "com.baeldung.jaxws.EmployeeService") public class EmployeeServiceImpl implements EmployeeService { @Inject private EmployeeRepository employeeRepositoryImpl; @WebMethod public Employee getEmployee(int id) { return employeeRepositoryImpl.getEmployee(id); } @WebMethod public Employee updateEmployee(int id, String name) { return employeeRepositoryImpl.updateEmployee(id, name); } @WebMethod public boolean deleteEmployee(int id) { return employeeRepositoryImpl.deleteEmployee(id); } @WebMethod public Employee addEmployee(int id, String name) { return employeeRepositoryImpl.addEmployee(id, name); } // ... }

7. Publishing the Web Service Endpoints

To publish the web services (top-down and bottom-up), we need to pass an address and an instance of the web service implementation to the publish() method of the javax.xml.ws.Endpoint class:

public class EmployeeServicePublisher { public static void main(String[] args) { Endpoint.publish( "//localhost:8080/employeeservicetopdown", new EmployeeServiceTopDownImpl()); Endpoint.publish("//localhost:8080/employeeservice", new EmployeeServiceImpl()); } }

We can now run EmployeeServicePublisher to start the web service. To make use of CDI features, the web services can be deployed as WAR file to application servers like WildFly or GlassFish.

8. Remote Web Service Client

Let's now create a JAX-WS client to connect to the EmployeeService web service remotely.

8.1. Generating Client Artifacts

To generate JAX-WS client artifacts, we can once again use the wsimport tool:

wsimport -keep -p com.baeldung.jaxws.client //localhost:8080/employeeservice?wsdl

La clase EmployeeService_Service generada encapsula la lógica para obtener el puerto del servidor usando URL y QName .

8.2. Conexión al servicio web

El cliente de servicio web utiliza el EmployeeService_Service generado para conectarse al servidor y realizar llamadas de servicio web de forma remota:

public class EmployeeServiceClient { public static void main(String[] args) throws Exception { URL url = new URL("//localhost:8080/employeeservice?wsdl"); EmployeeService_Service employeeService_Service = new EmployeeService_Service(url); EmployeeService employeeServiceProxy = employeeService_Service.getEmployeeServiceImplPort(); List allEmployees = employeeServiceProxy.getAllEmployees(); } }

9. Conclusión

Este artículo es una introducción rápida a los servicios web SOAP que utilizan JAX-WS .

Hemos utilizado los enfoques ascendente y descendente para crear servicios web SOAP utilizando la API JAX-WS. También hemos escrito un cliente JAX-WS que puede conectarse de forma remota al servidor y realizar llamadas de servicio web.

El código fuente completo está disponible en GitHub.