Foros de discusión

RE: Cómo generar Web Services a partir de servicios del Service Builder Lif

thumbnail
David García González, modificado hace 12 años.

Cómo generar Web Services a partir de servicios del Service Builder Liferay

Regular Member Mensajes: 127 Fecha de incorporación: 14/07/09 Mensajes recientes
Tengo unos servicios locales generados con el service Builder y quería poder acceder a ellos desde un Web Service.

¿Cuál sería la mejor forma de exponer estos servicios por un Web Service?
thumbnail
David García González, modificado hace 12 años.

RE: Cómo generar Web Services a partir de servicios del Service Builder Lif (Respuesta)

Regular Member Mensajes: 127 Fecha de incorporación: 14/07/09 Mensajes recientes
He seguido estos pasos para generar los web services, ¿hay otra alternativa mejor?:

1.- Construir los servicios remotos del Web Service

En el fichero service.xml hay que especificar si queremos que se generen las clases de los web services
con el parámetro de las entidades remote-service="true"
Regenerar el servicio

2.- Implementar los métodos que queramos que implemente el servicio remoto.

1.- Hay que editar la clase <Entidad>ServiceImpl.java para añadir los métodos que queramos.
2.- Regenerar el servicio.
3.- Hay un bug en Liferay que hace que no genere bien la clase <Entidad>ServiceSoap.java por lo que hay que modificar esta clase para cambiar los parámetros de los métodos. Este es un ejemplo:

public static EntitySoap[] getEntity(
		long groupId) throws RemoteException {
		try {
			java.util.List<entity> returnValue =
				EntityServiceUtil.getAvisos(groupId);

			return EntitySoap.toSoapModels(returnValue);
		}
		catch (Exception e) {
			_log.error(e, e);

			throw new RemoteException(e.getMessage());
		}
	}</entity>



3.- Generar el fichero WSDD

Ejecutar el target build-wsdd para generar el fichero server-config.wsdd que será el descriptor de despliegue del web service.

4.- Acceder al WSDL de los web services desplegados para verificar el despliegue


Desplegar de nuevo la aplicación y acceder a la url: http://ip:port/"war"/axis para ver los servicios expuestos y verificar que el despliegue.

5.- Crear el cliente del Web Service a partir del WSDL

a) En Eclipse ir a Nuevo -> Cliente Web service
b) Introducir la url del wsdl que queramos generar el cilente. Esta url sería:

  http://127.0.0.1:8080/<war>/axis/Plugin_<service>?wsdl</service></war>


Esta tarea nos genera las siguientes clases:
1.- La interfaz del portType (SDI)
2.- La implementación del servicio (proxy o stub)
3.- La interfaz del servicio, que tiene un método por cada portType que desclara el servicio.
4.- El locator que implementa la interfaz anterior y que nos sirve para instanciar los stubs o proxies

6.- Crear test unitarios para el cliente de Web Service para probar el cliente

Este es un ejemplo de un test para un método:

public void testGetAvisos() throws ServiceException, RemoteException, MalformedURLException {
		AvisoServiceSoapServiceLocator avisoServiceSoapServiceLocator = new AvisoServiceSoapServiceLocator();
		URL url = new URL("http://127.0.0.1:8080/Administracion-Avisos-portlet/axis/Plugin_em_av_AvisoService");
		AvisoServiceSoap avisoServiceSoap = avisoServiceSoapServiceLocator.getPlugin_em_av_AvisoService(url);
		AvisoSoap[] avisos = avisoServiceSoap.getAvisos(10522);
		assertNotNull(avisos);
	}


7.- Renombrar los paquetes del cliente

Los paquetes de las clases que genera el Eclipse para el cliente coinciden con los paquetes de las clases de los servicios remotos que genera el Service Builder de Liferay, por lo que si queremos tener en el mismo classpath las 2 clases tenemos que renombrar estos paquetes para que sean clases diferentes.

8.- Eliminar la clase de la entidad que genera el cliente

La clase de la entidad que genera Eclipse para el cliente no es necesaria porque el Service Builder ya genera una clase serializable que sirve para llamar a los servicios remotos. Esta clase está en el paquete model y se llamará <Entidad>Soap.java



9.- Modificar la propiedad tunnel.servlet.hosts.allowed en el fichero portal-ext.properties

Hay que modificar las siguientes propiedades en portal-ext.properties para configurar las ips que pueden acceder al servicio remoto.

##
## Axis Servlet
##

    #
    # See Main Servlet on how to protect this servlet.
    #
    axis.servlet.hosts.allowed=
    axis.servlet.https.required=false


GLOSARIO:
----------------------

SOAP: SOAP is an XML-based communication protocol and encoding format for inter-application communication.

AXIS: Axis is essentially a SOAP engine -- a framework for constructing SOAP processors such as clients, servers, gateways, etc.

WSDD: Web Service Deployment Descriptor (WSDD) format. A deployment descriptor contains a bunch of things you want to "deploy" into Axis - i.e. make available to the Axis engine. The most common thing to deploy is a Web Service.

WSDL: The Web Service Description Language is a specification authored by IBM and Microsoft.
WSDL serves to describe Web Services in a structured way. A WSDL description of a service tells us, in a machine-understandable way, the interface to the service, the data types it uses, and where the service is located.

SDI: The Service Definition Interface (SDI) is the interface that's derived from a WSDL's portType. This is the interface you use to access the operations on the service

REFERENCIAS:
-------------------------
Liferay:
http://arvindm.com/2010/03/23/web-services-in-liferay/
http://www.liferay.com/es/community/wiki/-/wiki/Main/Creating+Liferay+6+plugin+web+service

AXIS:
http://axis.apache.org/axis/java/user-guide.html