4.1.3. Использование сервисов среднего слоя
В предыдущем разделе мы рассмотрели инкапсуляцию бизнес-логики в бине клиентского уровня. Теперь мы пойдем дальше и поместим нашу логику в наиболее подходящее место: на средний слой. Сделав это, мы достигнем следующих целей:
-
Наши бизнес-методы будут доступны клиентам всех типов, включая Polymer UI.
-
Мы сможем использовать API, доступный только на middleware: EntityManager, transactions, и т.п.
Чтобы вызвать бизнес-метод среднего слоя, необходимо создать сервис. Studio может помочь в создании заготовки сервиса:
-
Переключитесь на вкладку Middleware и нажмите New > Service.
-
Измените имя интерфейса сервиса на
DiscountService
. Имена класса и самого сервиса будут изменены соответственно. Нажмите OK или Apply. -
Нажмите IDE и откройте интерфейс сервиса в IDE. Создайте новый метод и реализуйте его в классе сервиса.
См. пример реализации в демо-приложении:
-
CustomerBrowse.java and CustomerEdit.java - контроллер экрана, который вызывает сервис.
-
DiscountService.java - интерфейс сервиса.
-
DiscountServiceBean.java - класс реализации сервиса.
-
DiscountCalculator.java - бин среднего слоя, рассчитывающий скидки. Разумеется, сервис мог бы содержать бизнес-логику сам, но мы будем использовать этот делегат для того чтобы разделять логику с entity listener и JMX-бином (см. следующие разделы).
Обратите внимание, что данный бин отличается от рассмотренного в предыдущем разделе: он расположен в модуле core и использует EntityManager для загрузки суммы заказов из базы данных.
Теперь давайте сделаем наш бизнес-метод доступным для внешних клиентов через REST API:
-
Откройте сервис на редактирование в Studio и переключитесь на вкладку REST Methods.
-
Установите для метода флажок REST invocation allowed.
Studio создаст файл rest-services.xml
и зарегистрирует в нем метод. После перезапуска сервера вы сможете вызвать метод с помощью HTTP-запросов. Например, следующий GET-запрос должен работать с нашим онлайн демо-сервером:
https://demo1.cuba-platform.com/business-logic/rest/v2/services/sample_DiscountService/calculateDiscount?customerId=1797f54d-5bec-87a6-4330-d958955743a2
Имейте в виду, что демо-приложение имеет анонимный доступ. В большинстве реальных сценариев использования необходимо будет аутентифицироваться, прежде чем выполнять запросы.