Как известно, множество возможностей, предоставляемых Liferay Portal, доступны через сервисы. Недавно передо мной возникла задача написать Liferay-сервис, используемый несколькими портлетами. В данной статье я хочу рассмотреть основы создания сервисов для Liferay с использованием Service Builder.
В качестве среды разработки будем использовать Eclipse IDE (EE-версия). Также для работы с портлетами нам понадобятся Liferay IDE для Eclipse, а также Liferay SDK.
Cначала создадим простой портлет, в котором задействуем наш сервис. Для этого запускаем Eclipse, выбираем File → New → Liferay Project:

Вводим название проекта, в нашем случае это будет TestServiceProject:

Нажимаем Next, в следующем окне выбираем Liferay MVC, нажимаем Finish, и наш проект готов.
Давайте запустим его на выполнение:

В результате, после добавления портлета на наш портал, в браузере будет отображено следующее:

Теперь перейдем к созданию сервиса. Добавим локальный сервис в созданный проект и задействуем его в портлете данного проекта. Для этого используем Service Builder, который является инструментом для автоматизации разработки классов и интерфейсов сервиса.
Для создания сервиса выберите File → New → Liferay Service Builder. Откроется диалоговое окно. В нём необходимо ввести Package path: пакет, где будут располагаться классы нашего сервиса, а также Namespace – пространство имен для работы со схемой БД – в данной статье мы его использовать не будем:

Нажимаем Finish, при этом будет создан файл service.xml (в директории WEB-INF), в котором и определяется конфигурация нашего сервиса. Давайте его немного отредактируем – для этого нажмите на вкладку Source. Так как мы не будем добавлять новые записи в базу данных Liferay, удалим из файла записи с тегами column, order, finder, заменим entity name с Foo на TestEntity, а также для простоты (мы будем создавать локальный сервис) установим remote-service="false". В итоге наш 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_0_0.dtd">
<service-builder package-path="com.tuneit.test">
<author>vova</author>
<namespace>TestPr</namespace>
<entity name="TestEntity" local-service="true" remote-service="false">
</entity>
</service-builder>
Как видно, поля author и namespace сформированы на основе информации, введенной нами в диалоговом окне. В нашем случае entity name определяет название сервиса.
Теперь сохраните изменения и обратно перейдите на вкладку Overview. Нажмите на кнопку Build Services:

В случае успеха вы увидите в консоли Build Successful – это означает, что шаблон нашего сервиса готов.
Было сгенерировано большое количество классов и интерфейсов. Наибольшее значение для нас имеют следующие:
TestEntityLocalServiceImpl – реализация нашего локального сервиса. Это единственный класс в сервисе, который можно изменять вручную, все методы нашего сервиса будут располагаться в этом классе.
TestEntityLocalServiceUtil - в этом классе создается экземпляр TestEntityLocalServiceImpl, именно через этот класс происходит основная работа с сервисом, вызов предоставляемых им методов.
TestEntityLocalService – интерфейс для локального сервиса, он содержит сигнатуры методов, определенных в TestEntityLocalServiceImpl, а также в TestEntityLocalServiceBaseImpl.
TestEntityLocalServiceBaseImpl содержит ряд методов, реализующих общие функциональные возможности.
Методы локального сервиса могут вызываться клиентским кодом, исполняющимся в той же JVM, что и сам сервис.
Пока что наш сервис не предоставляет каких-либо возможностей. Давайте добавим метод, возвращающий некоторую строку. Для этого необходимо изменить класс TestEntityLocalServiceImpl, который расположен в пакете com.tuneit.test.service.impl:

Добавим в данный класс метод printStr(). В итоге класс будет выглядеть следующим образом:
package com.tuneit.test.service.impl;
import com.tuneit.test.service.base.TestEntityLocalServiceBaseImpl;
public class TestEntityLocalServiceImpl extends TestEntityLocalServiceBaseImpl {
public String printStr() {
return "This is string from TestEntityLocalService!";
}
}
Теперь необходимо пересобрать сервис. Мы хотим, чтобы добавленный метод стал доступен через TestEntityLocalServiceUtil. Еще раз хочу обратить внимание - напрямую методы в TestEntityLocalServiceUtil добавлять не надо. После изменения TestEntityLocalServiceImpl откройте service.xml и нажмите Build Services. Когда закончится сборка сервиса, откройте TestEntityLocalServiceUtil. Класс будет выглядеть примерно так:
public class TestEntityLocalServiceUtil {
public static java.lang.String printStr() {
return getService().printStr();
}
…
}
Помимо множества вспомогательных методов в классе присутствует необходимый нам printStr. Давайте задействуем новый сервис в ранее созданном портлете. Измените файл view.jsp, приведя его к следующему виду:
<%@taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet" %>
<%@page import="com.tuneit.test.service.TestEntityLocalServiceUtil"%>
<portlet:defineObjects />
This is the <b>TestServiceProject</b> portlet.
<%= TestEntityLocalServiceUtil.printStr() %>
Теперь запустим портлет и посмотрим, работает ли наш сервис. В результате на экран будет выведено примерно следующее:

Наш сервис работает!
В данной статье описаны лишь базовые вещи, касающиеся создания и работы с сервисами. Если у вас появились вопросы, пишите.
Спасибо за внимание!