Crear una API SOAP Java JAX-WS
A continuación, explicaré cómo crear servicios web SOAP, o lo que es lo mismo…crear una API SOAP Java JAX-WS. Usaremos los métodos comunes para publicar los servicios en nuestra máquina local.
¿Qué es SOAP? Simple Object Access Protocol. Es un protocolo de comunicación, normalmente vía HTPS o JMS, en el que el intercambio de mensajes de realiza mediante un formato de XML llamado WSDL (Web Services Description Language).
Estos tipos de servicios son independientes de la plataforma y del lenguaje, es decir, el servidor puede estar desarrollado en JAVA y el cliente en .NET o PHP.
La librería utilizada para los servicios SOAP es JAX-WS: (Java API for XML Web Services).
Crear proyecto web dinámico
Con Eclipse abierto, selecciona File -> New -> Dynamic Web Project.

Presiona Finish.
Crear clases
Crear modelo
User.java
package es.rosamarfil.model;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlValue;
public class User implements Serializable {
private static final long serialVersionUID = 1L;
public static List<User> users = new ArrayList<>(Arrays.asList(
new User("Rosa", "Marfil"),
new User("Pepito", "Grillo"),
new User("Manuela", "Río")));
public String name;
public String username;
public User() {
super();
}
public User(String name, String username) {
super();
this.name = name;
this.username = username;
}
public void setName(String name) {
this.name = name;
}
public void setUsername(String username) {
this.username = username;
}
public static List<User> getUsers()
{
return users;
}
}
Crear Interface e implementación
Vamos a crear una interfaz con lo métodos a publicar. La llamaremos SOAPI.java
SOAPI.java (Interface)
package es.rosamarfil.soap;
import java.util.List;
import javax.jws.WebMethod;
import javax.jws.WebService;
import es.rosamarfil.model.User;
@WebService
public interface SOAPI {
@WebMethod
public List<User> getUsers();
@WebMethod
public void addUser(User user);
}
SOAPImpl.java (Implementación)
package es.rosamarfil.soap;
import java.util.List;
import javax.jws.WebService;
import es.rosamarfil.model.User;
@WebService(endpointInterface = "es.rosamarfil.soap.SOAPI")
public class SOAPImpl implements SOAPI{
@Override
public List<User> getUsers() {
return User.getUsers();
}
@Override
public void addUser(User user) {
User.getUsers().add(user);
}
}
Publicar servicios
Para ello, vamos a crear una clase «main», que se ejecute al iniciar nuestra aplicación y publique los servicios. Para ello, es fundamental el uso de la clase EndPoint que provee la librería JAX-WS.

PublishServices.java
package es.rosamarfil;
import javax.xml.ws.Endpoint;
import es.rosamarfil.soap.SOAPImpl;
public class PublishServices {
public static void main(String[] args) {
/*
* Se publican los servicios a través de un servidor virtual.
El puerto puede ser cualquiera.
Un vez ejecutada la aplicación, se publica el contrato WSDL
*/
Endpoint.publish("http://localhost:1516/WS/Users", new SOAPImpl());
}
}
Para publicar el contrato, ejecutamos como una aplicación java. Observa que no existen errores en la consola de Eclipse.
En el navegador introduce: http://localhost:1516/WS/Users?wsdl y observa las operaciones que el servidor pone a disposición a través del wsdl.
<?xml version="1.0" encoding="ISO-8859-1"?>
<!-- Published by JAX-WS RI (http://jax-ws.java.net). RI's version is JAX-WS RI 2.2.9-b130926.1035 svn-revision#5f6196f2b90e9460065a4c2f4e30e065b245e51e. -->
<!-- Generated by JAX-WS RI (http://jax-ws.java.net). RI's version is JAX-WS RI 2.2.9-b130926.1035 svn-revision#5f6196f2b90e9460065a4c2f4e30e065b245e51e. -->
<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" name="SOAPImplService" targetNamespace="http://soap.rosamarfil.es/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://soap.rosamarfil.es/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" xmlns:wsp1_2="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsp="http://www.w3.org/ns/ws-policy" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<types>
<xsd:schema>
<xsd:import schemaLocation="http://localhost:1516/WS/Users?xsd=1" namespace="http://soap.rosamarfil.es/"/>
</xsd:schema>
</types>
<message name="addUser">
<part name="parameters" element="tns:addUser"/>
</message>
<message name="addUserResponse">
<part name="parameters" element="tns:addUserResponse"/>
</message>
<message name="getUsers">
<part name="parameters" element="tns:getUsers"/>
</message>
<message name="getUsersResponse">
<part name="parameters" element="tns:getUsersResponse"/>
</message>
<portType name="SOAPI">
<operation name="addUser">
<input message="tns:addUser" wsam:Action="http://soap.rosamarfil.es/SOAPI/addUserRequest"/>
<output message="tns:addUserResponse" wsam:Action="http://soap.rosamarfil.es/SOAPI/addUserResponse"/>
</operation>
<operation name="getUsers">
<input message="tns:getUsers" wsam:Action="http://soap.rosamarfil.es/SOAPI/getUsersRequest"/>
<output message="tns:getUsersResponse" wsam:Action="http://soap.rosamarfil.es/SOAPI/getUsersResponse"/>
</operation>
</portType>
<binding type="tns:SOAPI" name="SOAPImplPortBinding">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="addUser">
<soap:operation soapAction=""/>
<input>
<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>
</operation>
<operation name="getUsers">
<soap:operation soapAction=""/>
<input>
<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>
</operation>
</binding>
<service name="SOAPImplService">
<port name="SOAPImplPort" binding="tns:SOAPImplPortBinding">
<soap:address location="http://localhost:1516/WS/Users"/>
</port>
</service>
</definitions>
Probar los Servicios a través de un Cliente
En Eclipse, crea un proyecto nuevo Java:

A continuación, selecciona el proyecto y selecciona File -> New -> Other ->Web Services -> Web Service Client. Asigna la dirección donde se publica el contrato wsdl. Presiona Finish.

Se crean las siguientes clases:

Crea una clase de ejecución «main» llamada UserClient.java:

Completamos la clase para llamar a los servicios, de tal forma que quede así:
package es.rosamarfil.client;
import java.rmi.RemoteException;
import java.util.Arrays;
import javax.xml.rpc.ServiceException;
import es.rosamarfil.soap.SOAPI;
import es.rosamarfil.soap.SOAPImplServiceLocator;
import es.rosamarfil.soap.User;
public class UserClient {
public static void main(String[] args) {
SOAPImplServiceLocator locator = new SOAPImplServiceLocator();
try {
SOAPI userService = locator.getSOAPImplPort();
//Se muestra la lista de usuarios
System.out.println("Lista de usuarios: \n" + Arrays.toString(userService.getUsers()));
//Se añade nuevo usuario
userService.addUser(new User("Pablo","Ruiz"));
//Se muestra la lista de usuarios
System.out.println("Lista de usuarios: \n" + Arrays.toString(userService.getUsers()));
} catch (ServiceException e) {
e.printStackTrace();
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
Salida por consola:

Para mostrar los datos de casa usuario se ha sobreescrito el método toString() de la clase es.rosamarfil.soap.User:
@Override
public String toString() {
return "User [name=" + name + ", username=" + username;
}
Y esto es todo!! Esta es una forma sencilla para empezar a crear servicios SOAP JAVA y crear una API SOAP Java con JAX-WS.
Recuerda que también es posible crear servicios Web con otras tecnologías, como es REST. Aunque cada tecnología se usará para fines determinados. Si te interesa como crear una API REST, puedes eharle un ojo aquí: Crear una API REST JAVA
Espero que te haya sido de utilidad y nos vemos en el próximo tutorial.
Comparte si te ha gustado!!
para publicar un servicio Soap ajuro tengo que crear un main? y otra pregunta en caso que quiera crear una aplicacion web para publicar el servicio SOAP tendria que crear un metodo o ajuro tiene que ser en un main
Hola Hector.
Respondo tus preguntas:
A la primera pregunta, yo he creado un ejemplo básico y para publicar el servicio en java he necesitado partir de una ejecución principal y para ello se usa el método main. Pero existen otras formas de crear servicios SOAP, como por ejemplo con spring. Esto requiere utilizar unas librerías específicas y usar ficheros de configuración.
A la segunda, para publicar el servicio SOAP la forma más simple es partir de la clase main. Pero los servicios pueden estar creados en métodos independientes y ser llamados desde la clase main.