Skip to content

[BE] Update project back-end Spring boot version to 3 and Gradle version too #2757

Description

@umedvedev

Обновление стека: Spring Boot 2.5 → 3.5 (+ сопутствующие зависимости)

Цель

Перевести backend на актуальный Spring Boot 3.x / Spring Framework 6 и Hibernate 6, чтобы уйти с EOL-версий, закрыть накопившиеся уязвимости в транзитивных зависимостях и разблокировать дальнейшие обновления.

Что обновлено

  • Spring Boot 2.5.9 → 3.5.3, spring-dependency-management 1.0.11 → 1.1.7
  • Hibernate ORM 6.6 (приходит с Boot 3.5), Jakarta EE — миграция пакетов javax.* → jakarta.*
  • Flyway 6.5.5 → 11.8.2 (+ добавлен flyway-database-postgresql)
  • springdoc-openapi 1.6.12 → 2.8.6 (стартер springdoc-openapi-starter-webmvc-ui)
  • JUnit 5.3.1 → 5.12.2, Testcontainers 1.15.1 → 1.21.3, spring-cloud-contract-wiremock 3.1.1 → 4.3.0, okhttp3 4.10 → 4.12, kotlinx-coroutines 1.6.0 → 1.10.1, org.json 20210307 → 20250107
  • Целевая JVM — Java 17

Ключевые изменения в коде

  • Spring Security 6: конфиг переведён с WebSecurityConfigurerAdapter / authorizeRequests() на бинову SecurityFilterChain / authorizeHttpRequests(); @EnableGlobalMethodSecurity@EnableMethodSecurity.
  • Gradle/Kotlin DSL: kotlinOptions.jvmTarget → compilerOptions.jvmTarget, замена $buildDir на layout.buildDirectory.
  • Удалён spring-boot-starter-batch (не использовался).

Правки, найденные при поднятии на новом стеке

  • HQL под Hibernate 6 (StudyHistoryRepository) — строгая валидация запросов на старте роняла контекст. Исправлено:
    • сырое имя колонки user_id → property-путь s.userAccount.id;
    • PostgreSQL-функции date_trunc(...), now() → портируемый HQL cast(s.startTime as date) / current_date;
    • EXTRACT(MONTH/YEAR FROM ...) → month() / year().
  • Регрессия авторизации (WebSecurityBasicConfiguration) — в Spring Security 6 authorizeHttpRequests отклоняет непокрытые правилом запросы (401), тогда как раньше они разрешались. Возвращено прежнее поведение через
    anyRequest().permitAll(); защита остаётся на @RolesAllowed уровне методов. Иначе публичные GET-эндпоинты (например, /api/contributors, используемый на сайте без авторизации) отдавали бы 401.

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions