Для использования библиотеки необходимо ее подключить в проект. Способ подключения зависит от вида проекта. Например, для maven проекта нужно добавить зависимость
<dependency> <groupId>ru.funsys.avalanche</groupId> <artifactId>avalanche-rs</artifactId> <version>${avalanche.version}</version> </dependency>
где ${avalanche.version} - номер версии библиотеки, например:
<properties> <avalanche.version>1.3.2</avalanche.version> </properties>
Помимо добавления зависимости возможно потребуется добавить maven репозиторий, в котором опубликованы библиотеки "Avalanche - application framework for Java". Это можно сделать несколькими способами, например в файл pom.xml проекта или в файл settings.xml локального maven репозитория.
В программной модели приложения использования библиотеки avalanche-rs определяется класс сервиса, в котором декларируются методы REST сервиса с использованием аннотаций библиотеки Jersey и, при необходимости, аннотаций Swagger. В приложении можно определить множество подобных классов.
В классе сервиса необходимо обеспечить наличие одного, множества или массивов полей классов, наследуемых от класса ru.funsys.avalanche.Application, в которых и определяется вся логика реализуемых методов сервиса. Для автоматической установки этих полей класс сервиса должен наследоваться от класса ru.funsys.avalanche.rs.RestService.
Автоматическая установка полей классов осуществляется по имени поля (имя поля совпадает с именем экземпляра класса, определенного в секции <application> в файле конфигурации приложения) или по типу поля (происходит подбор экземпляров классов, определенных в секциях <application> до совпадения типов).
Пример реализации класса сервиса
public class Service extends RestService { /** * Поле устанавливается автоматически */ private WebApp app; @Operation(summary = "Получить список смартфонов", responses = { @ApiResponse(responseCode = "200", description = "Ok", content = @Content(array = @ArraySchema(schema = @Schema(implementation = Smartphone.class)))), @ApiResponse(responseCode = "401", description = "Unauthorized"), @ApiResponse(responseCode = "403", description = "Forbidden"), @ApiResponse(responseCode = "500", description = "Internal server error") }) @GET @Path("/list") public Smartphone[] list() throws WebApplicationException { try { return app.list(); } catch (Exception e) { throw new WebApplicationException(e, 500); } } ... }
где поле app - экземпляр класса WebApp, наследуемого от ru.funsys.avalanche.Application
Можно явно указать какой экземпляр класса тега <application> устанавливать в поле класса сервиса аннотацией SetApplication.
Пример использования аннотации SetApplication в классе сервиса
public class Service extends RestService { /** * Установка значения с использованием аннотации */ @SetApplication("WebApp") private WebApp app; ... }
где значение аннотации "WebApp" это значение атрибута name тега <application> в файле конфигурации приложения.
Пример реализации класса WebApp
public class WebApp extends Application { /* ----- Атрибуты класса ----- */ @CfgAttribute(description = "Адаптер доступа к функциям БД") private Adapter database; // другие поля класса ... /** * Получить список смартфонов * * @return результат выполнения запроса * * @throws Exception ошибка выполнения запроса */ public Smartphone[] list() throws Exception { String sql = getParameterValue("list"); if (sql == null) { String error = error("RS00001E", "list", getNodeName(), getName()); throw new NullPointerException(error); } else { sql = String.format(sql, table()); } return database.select(sql, Smartphone.class); } // другие методы класса ... }
В файле конфигурации приложения должна быть определена секция, содержащая конфигурационные параметры класса ru.funsys.avalanche.sql.Database, обязательно должны быть определены атрибуты name и resource. Допускается определение конфигурации класса ru.funsys.avalanche.sql.Database как секцией <function>, так и секцией <application>.
Пример определения в секции <function>
<!-- Сервисные функции работы с БД, источник данных БД определяется в конфигурации контекста WEB приложение (для Tomcat см. вложенный элемент <Resource> секции <context>) --> <function class="ru.funsys.avalanche.sql.Database" name="database" description="Функция доступа к БД" resource="java:/jboss/datasources/PostgresDataSource"> </function>
Пример определения в секции <application>, обязательно должен быть определен атрибут function в значении true
<!-- Сервисные функции работы с БД, источник данных БД определяется в конфигурации контекста WEB приложение (для Tomcat см. вложенный элемент <Resource> секции <context>) --> <application class="ru.funsys.avalanche.sql.Database" name="database" description="Функция доступа к БД" resource="java:/jboss/datasources/PostgresDataSource" function="true"> </application>
Если приложение должно работать с несколькими базами данных, то в конфигурации приложения определяются несколько секций класса ru.funsys.avalanche.sql.Database. Для каждого источника данных своя секция класса.
В секциях <application> одной или несколькими дочерними секциями adapter определяются адаптеры доступа к объектам ru.funsys.avalanche.sql.Database
Пример определения адаптера ru.funsys.avalanche.sql.Adapter, в атрибуте uri указывается локальное имя экземпляра класса ru.funsys.avalanche.sql.Database (значение атрибута name соответствующей секции <function> или <application>).
<application class="ru.app.demo.rs.app.WebApp" name="WebApp" description="WEB приложение"> <adapter class="ru.funsys.avalanche.sql.Adapter" name="database" uri="database" /> <!-- Дочерние элементы конфигурации --> ... </application>