null

Создание сервисов в Liferay Portal

Как известно, множество возможностей, предоставляемых 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() %>

 

Теперь запустим портлет и посмотрим, работает ли наш сервис. В результате на экран будет выведено примерно следующее:

 

Наш сервис работает!

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

Спасибо за внимание!

В сферу интересов входят вопросы, связанные с хранением данных и парадигмами программирования.

Предпочитаю Java и Scala.

Ничего не найдено. n is 0