null

Сервисы в Liferay Portal

Liferay предоставляет достаточно удобные инструменты для создания SOAP сервисов. Рассмотрим простой пример.

1. Создаем новый портлет

./create.sh TestServiceProject

2. Создаем файл с описанием сервисов docroot/WEB-INF/service.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE service-builder PUBLIC "-//Liferay//DTD Service Builder 6.0.0//EN" "http://www.liferay.com/dtd/liferay-service-builder_6_1_0.dtd">

<service-builder package-path="com.tuneit.test">
    <author>anthony</author>
    <namespace>TestPr</namespace>
    <entity name="TestEntity" local-service="true" remote-service="true">
    </entity>  
</service-builder>

3. Запускаем генерацию классов на основе заданного нами описания

ant build-service

4. Добавляем наше метод, который мы будем вызывать удаленно в класс TestEntityServiceImpl

public class TestEntityServiceImpl extends TestEntityServiceBaseImpl {
	public String printStr() {
		return "Hello world!";
	}
}

5. Еще раз выполняем построение сервисов

ant build-service

6. Запускаем генерацию wsdd-схемы

ant build-wsdd

7. Собираем проект

ant war

8. Редактируем параметры портала в portal-ext.properties (domains/domain-name/config/portal-ext.properties для glassfish, webapps/ROOT/WEB-INF/classes/portal-ext.properties для tomcat)

axis.servlet.hosts.allowed=127.0.0.1,SERVER_IP
axis.servlet.https.required=false
company.security.auth.type=screenName

9. Деплоим портлет на сервер

10. Проверяем доступность и корректность добавленных сервисов

http://localhost:8080/TestServiceProject-portlet/api/axis

http://localhost:8080/TestServiceProject-portlet/api/axis/Plugin_TestPr_TestEntityService?wsdl

<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl="urn:http.service.test.tuneit.com"xmlns:intf="urn:http.service.test.tuneit.com" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:http.service.test.tuneit.com">
<!--
WSDL created by Apache Axis version: 1.4Built on Apr 22, 2006 (06:55:48 PDT)
-->
<wsdl:message name="printStrRequest"/>
<wsdl:message name="printStrResponse">
<wsdl:part name="printStrReturn" type="xsd:string"/>
</wsdl:message>
<wsdl:portType name="TestEntityServiceSoap">
	<wsdl:operation name="printStr">
		<wsdl:input message="impl:printStrRequest" name="printStrRequest"/>
		<wsdl:output message="impl:printStrResponse" name="printStrResponse"/>
	</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="Plugin_TestPr_TestEntityServiceSoapBinding" type="impl:TestEntityServiceSoap">
	<wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
	<wsdl:operation name="printStr">
		<wsdlsoap:operation soapAction=""/>
		<wsdl:input name="printStrRequest">
			<wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:http.service.test.tuneit.com" use="encoded"/>
		</wsdl:input>
		<wsdl:output name="printStrResponse">
			<wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:http.service.test.tuneit.com" use="encoded"/>
		</wsdl:output>
	</wsdl:operation>
</wsdl:binding>
<wsdl:service name="TestEntityServiceSoapService">
	<wsdl:port binding="impl:Plugin_TestPr_TestEntityServiceSoapBinding" name="Plugin_TestPr_TestEntityService">
		<wsdlsoap:address location="http://localhost:8080/TestServiceProject-portlet/api/axis/Plugin_TestPr_TestEntityService"/>
	</wsdl:port>
</wsdl:service>
</wsdl:definitions>

11. Переходим к клиентской части. В Eclipse создаем новое Java приложение (File -> New -> Java Project).

12. Добавляем клиент для сервиса (File -> New -> Web Services -> Web Service Client). 

Service definition : http://localhost:8080/TestServiceProject-portlet/api/axis/Plugin_TestPr_TestEntityService?wsdl

13. Генерируются следующие классы

Plugin_TestPr_TestEntityServiceSoapBindingStub
TestEntityServiceSoap
TestEntityServiceSoapProxy
TestEntityServiceSoapService
TestEntityServiceSoapServiceLocator

14. Используем сервис и вызываем метод удаленно

package com.tuneit.test.service.test;

import java.rmi.RemoteException;

import javax.xml.rpc.ServiceException;

import com.tuneit.test.service.http.TestEntityServiceSoap;
import com.tuneit.test.service.http.TestEntityServiceSoapServiceLocator;

public class Test {	
	public static void main(String... args) throws ServiceException, RemoteException {
		TestEntityServiceSoapServiceLocator locator = new TestEntityServiceSoapServiceLocator();
		TestEntityServiceSoap service = locator.getPlugin_TestPr_TestEntityService();
		
		System.out.println(service.printStr());
	}
}