Spring + Firebird + REST. Часть 1 Конфигурирование проекта

в 6:06, , рубрики: firebird, java, spring data, spring rest

Вместо вступления

Если разбираешь что-то, попробуй это описать понятным языком и найти того, кто прочитает и выступит с замечаниями (перефразировал Р.Фейнмана, таки да я это сделал).
Все комментарии, даже злобные в стиле "Да, что этот ~белый~~чел. себе позволяет" приветствуются.

Цели

Приложения — отображение отчетов о ходе продукта (весы) по возможности с раздачей этих данных по сети в пределах предприятия (для функционала);
Личная — немного разобраться в технологии spring

Технологии

  • Spring Web
  • Spring JPA
  • Lombock
    • Thymeleaf
  • SpringFox Swagger (буду тестить рест на нем)
  • jaybird-jdk17, версия 3.0.5
  • Maven

Мотивация запилить spring+firebird

Недавно было сделано первое клиентское место под ОС Linux Mint для оператора "Овсезавода" и не всегда адекватная работа отображения отчетов из под Wine. (все остальное работает норм — визуализация Qt — SCADA, архивы Java SE).

Некоторые грабли на которые пришлось наступить

  1. jackson зависимости разных версий (исправлено),
  2. firebird не установленный тип кодировки ведет к default (ной) NONE,

Ссылка на git в конце публикации .

Jackson и все все все

Разные компоненты затянули jackson разных версий, как то неприятно, надо исправить.
Выявлено командной

mvn dependency:tree -Dincludes=com.fasterxml.jackson.core

+- org.springframework.boot:spring-boot-starter-web:jar:2.1.0.RELEASE:compile
[INFO] |  - org.springframework.boot:spring-boot-starter-json:jar:2.1.0.RELEASE:compile
[INFO] |     - com.fasterxml.jackson.core:jackson-databind:jar:2.9.7:compile
[INFO] - io.springfox:springfox-swagger2:jar:2.7.0:compile
[INFO]    - io.swagger:swagger-models:jar:1.5.13:compile
[INFO]       - com.fasterxml.jackson.core:jackson-annotations:jar:2.8.5:compile

Исправляем в pom.

      <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.9.7</version>
            <exclusions>
                <exclusion>
                    <groupId>com.fasterxml.jackson.core</groupId>
                    <artifactId>jackson-core</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>com.fasterxml.jackson.core</groupId>
                    <artifactId>jackson-annotations</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.9.7</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.9.7</version>
        </dependency>

Подправил, ок. получилось. Если используете IDEA, то здесь еще проще посмотреть External Libraries. Что все зависимости есть и они нужных версий.

Общая структура приложения

С послойным тестированием Spring Boot приложения не знаком, поэтому сделаю без тестов
("Да что этот #цвет_кожи себе позволяет").
Spring + Firebird + REST. Часть 1 Конфигурирование проекта - 1

Конфигурация приложения

Поскольку я seasoned developer, а значит не ознакомлен с устоявшимися методами, то буду делать :

  1. в application.yml (пока настраиваю подключение к БД)
    spring:
    datasource:
    driver-class-name: org.firebirdsql.jdbc.FBDriver
    url: jdbc:firebirdsql://host:3050//work/cmn/db/namedb.fdb?sql_dialect=3&charSet=utf-8
    username: ******
    password: ******
    useUnicode: true
    characterEncoding: UTF-8
    sql-script-encoding: UTF-8
    jpa:
    show-sql: true
  2. используя аннотации непосредственно в классах:

Если не указать charSet=utf-8, то дефолтная будет NONE : На случай если в таблицах тоже NONE — получим нечитаемые символы или, согласно firebirdsql.org:

3.2.4 How can I solve the error “Connection rejected: No connection character set specified”
If no character set has been set, Jaybird 3.0 will reject the connection with an SQLNonTransientConnectionException with message “Connection rejected: No connection character set specified (property lc_ctype, encoding, charSet or localEncoding). Please specify a connection character set (eg property charSet=utf-8) or consult the Jaybird documentation for more information.”

Минимальный набор классов и файлов

Для начала index.html содержит пустое body;
Обкатка API — Swagger, package (infra) конфигурации которого поместим на уровне с остальными package проекта.

Spring + Firebird + REST. Часть 1 Конфигурирование проекта - 2

Добавлю в проект:

  • package model
    • clacc CModule — он же Data( getter, setter для членов, спасибо Lombok за минимум "code monkey"), он же Entity (сущность таблицы БД);
  • package repository
    • interface CModuleRepository extends JpaRepository<CModule,String> (он будет выбирать данные из базы), причем пока в него ничего добавлять не надо (типо Query);
  • package services;
    • class CModuleService — он же Service и @Transactional(readOnly = true) для работы с репозиторием;
  • package resources
    • class CModulesResource — он же @RestController, @RequestMapping("/modules") отвечать будет за обращение по этому адресу. Response body сделает сам (для нас выглядит так)

Будем работать с API RestController по всем путям, укажем это Swagger:

@Configuration
@EnableSwagger2
public class SwaggerConfiguration {
    @Bean
    public Docket documentation(){
        return new Docket(DocumentationType.SWAGGER_2)
                .select()
                .apis(RequestHandlerSelectors.withClassAnnotation(RestController.class))
                .paths(PathSelectors.any())
                .build();
    }
}

Создадим класс запускающий Spring Application:

@SpringBootApplication
public class App {
    public static void main(String[] args) {
        SpringApplication.run(App.class,args);
    }
}

Модели, репозитории, request созданы для нужной таблицы (у меня это modules):
теперь можно браться за @RestController

@RestController
@RequestMapping("/modules")
@Api(tags = "Modules", description = "Modules API")
public class CModulesResource {
....

@GetMapping(value = "/{name}")
    @ApiOperation(value = "Find module",notes = "Find the module by Name")
    @ApiResponses(value = {
            @ApiResponse(code = 200,message = "Modules found"),
            @ApiResponse(code = 404,message = "Modules not found"),
    })

Api — название класса с описанием;
@ApiOperation название метода с описанием;
@ApiResponses возвращаемые коды API;
@ApiResponse конкретный код с описанием;

Пример (да в нем еще сущность main, которую в статье не описываю)
Spring + Firebird + REST. Часть 1 Конфигурирование проекта - 3

Теперь можно потестировать выборку данных по REST API.

Список используемой литературы:

1. https://www.baeldung.com
2. https://docs.spring.io
3. Spring in Action, 5th Edition
4. https://www.firebirdsql.org/file/documentation/drivers_documentation/java/faq.html#how-can-i-solve-the-error-connection-rejected-no-connection-character-set-specified

githublink

Гитхаб проекта

Автор: AlexisVaBel

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js