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());
}
}