Цель задания — разработать Spring Boot приложение, которое:
- Импортирует данные из CSV-файлов в PostgreSQL.
- Возвращает иерархию данных в формате JSON через REST API.
- Использует Docker для автоматизации развертывания.
Требования:
- Данные из CSV (
plm.csv,plmHierarchy.csv,Classes.csv) должны автоматически загружаться в БД. - Эндпоинт
GET /plmDataвозвращает JSON с вложенными дочерними элементами в полеchildren. - Иерархия строится на основе связей из таблицы
plmhierarchy.
- Java 21
- Spring Boot
- PostgreSQL
- Flyway
- Docker
- Lombok
-
Импорт данных в PostgreSQL
- Использован Flyway для автоматических миграций:
V1__create_tables.sql— создание таблиц.V2__import_data.sql— загрузка данных из CSV.
- Данные хранятся в таблицах:
plm,plmhierarchy,classes.
- Использован Flyway для автоматических миграций:
-
Построение иерархии
- Реализована рекурсивная SQL-функция
get_plm_hierarchy():- Использован рекурсивный CTE для обхода родительско-дочерних связей.
- Результат преобразован в JSON с помощью
json_aggиjson_build_object.
- Реализована рекурсивная SQL-функция
-
REST API
- Контроллер
PlmControllerобрабатывает GET-запросы на/plmData. - Сервис
PlmServiceвызывает SQL-функцию и десериализует JSON в DTO (PlmNode).
- Контроллер
-
Docker-развертывание
Dockerfile— сборка приложения в образ Java.docker-compose.yml— запуск PostgreSQL и приложения.- CSV-файлы монтируются в контейнер для импорта.
-
Особенности
- Обработка циклов через массив
pathв CTE. - Поле
childrenотсутствует, если дочерних элементов нет.
- Обработка циклов через массив
- Убедитесь, что CSV-файлы (plm.csv, plmHierarchy.csv, Classes.csv) находятся в папке csv в корне проекта.
docker-compose up --buildhttp://localhost:8080/plmData.
[
{
"objectId": 1,
"name": "РС_Администратор",
"oboznachenie": "",
"className": "Рабочий стол",
"children": [
{
"objectId": 2,
"name": "Деталь01",
"oboznachenie": "545344535",
"className": "Деталь",
"children": []
},
{
"objectId": 3,
"name": "Деталь02",
"oboznachenie": "TopsBI-004-2024",
"className": "Деталь",
"children": [
{
"objectId": 4,
"name": "Деталь02",
"oboznachenie": "TopsBI-004-2024",
"className": "Деталь",
"children": []
}
]
}
]
}
]Убедитесь, что файлы находятся в папке csv, а пути в V2__import_data.sql корректны.