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.