From abad3776db3fb8cc3612f5f88a2dc332983b3ac8 Mon Sep 17 00:00:00 2001 From: Zuev Date: Thu, 12 Mar 2026 22:42:57 +0300 Subject: [PATCH] feat: Add H2 in-memory database dependency for fallback scenarios. --- backend/pom.xml | 7 +++++++ .../config/tenant/TenantDataSourceConfig.java | 17 ++++++++++++++--- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/backend/pom.xml b/backend/pom.xml index 6f9485a..c5da69f 100755 --- a/backend/pom.xml +++ b/backend/pom.xml @@ -43,6 +43,13 @@ org.springframework.security spring-security-crypto + + + + com.h2database + h2 + runtime + diff --git a/backend/src/main/java/com/magistr/app/config/tenant/TenantDataSourceConfig.java b/backend/src/main/java/com/magistr/app/config/tenant/TenantDataSourceConfig.java index c7674b6..c061f48 100644 --- a/backend/src/main/java/com/magistr/app/config/tenant/TenantDataSourceConfig.java +++ b/backend/src/main/java/com/magistr/app/config/tenant/TenantDataSourceConfig.java @@ -2,6 +2,7 @@ package com.magistr.app.config.tenant; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; +import com.zaxxer.hikari.HikariDataSource; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; @@ -24,6 +25,9 @@ import java.util.*; /** * Конфигурация мультитенантного DataSource. * Загружает тенанты из JSON-файла и регистрирует TenantInterceptor. + * + * Если нет ни одного настроенного тенанта — создаёт H2 in-memory БД + * как заглушку, чтобы Spring JPA мог инициализироваться. */ @Configuration public class TenantDataSourceConfig implements WebMvcConfigurer { @@ -68,10 +72,18 @@ public class TenantDataSourceConfig implements WebMvcConfigurer { } } + // Если всё ещё нет ни одного тенанта — H2 in-memory заглушка if (routingDataSource.getTenantConfigs().isEmpty()) { log.warn("=== НЕТ НАСТРОЕННЫХ ТЕНАНТОВ ==="); - log.warn("Backend запустится, но API не будет работать без подключения к БД."); - log.warn("Добавьте тенант через POST /api/database/tenants или настройте tenants.json"); + log.warn("Создаём H2 in-memory заглушку для запуска приложения."); + log.warn("Добавьте тенант через POST /api/database/tenants"); + + TenantConfig h2Fallback = new TenantConfig( + "H2 Placeholder", "default", + "jdbc:h2:mem:placeholder;DB_CLOSE_DELAY=-1", + "sa", "" + ); + routingDataSource.addTenant(h2Fallback); } return routingDataSource; @@ -91,7 +103,6 @@ public class TenantDataSourceConfig implements WebMvcConfigurer { HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); vendorAdapter.setGenerateDdl(true); - vendorAdapter.setDatabasePlatform("org.hibernate.dialect.PostgreSQLDialect"); em.setJpaVendorAdapter(vendorAdapter); Map props = new HashMap<>();