Планируешь миграцию на Spring Boot 4.0? Вместе с Eddy Benchek в новом переводе от команды Java Insider разбираем пять неочевидных проблем, с которыми столкнулась реальная production-команда при миграции, и показываем, как их исправить, чтобы вы не потеряли дни на поиски непонятных багов.

В теории всё просто: обновил зависимости, поправил ворнинги и запустил.

А что на практике? Всё ломается тихо. Ломается снова и снова. И часто там, где не ждёшь.

Недавно мы мигрировали наше приложение со Spring Boot 3.x на 4.0, и я хочу поделиться тем, что именно сломалось, почему это произошло и как мы это исправили, чтобы вы не потеряли дни на поиски багов.


Почему миграция на Spring Boot 4.0 сложнее, чем кажется

Spring Boot 4.0 — это не просто обновление версии. Это совокупность изменений из:

  • Обязательного перехода на Jakarta EE namespace

  • Spring Framework 7

  • Изменений в базовой версии Java

  • Рефакторинга Security и observability

Самое плохое, что проблемы часто не проявляются на этапе компиляции. Они возникают:

  • При старте приложения

  • В тестах (если повезет)

  • Уже в проде


1️⃣ Граничные случаи Jakarta EE, которые вы считали исправленными

Симптом
Приложение компилируется, но падает при запуске с ClassNotFoundException или NoSuchMethodError.

Даже если вы уже перешли на Jakarta в Spring Boot 3.x, некоторые транзитивные зависимости всё ещё тянут классы из javax.*.

Частые виновники:

  • старые библиотеки валидации

  • SOAP / JAXB инструменты

  • устаревшие servlet фильтры

Решение

Выполните:

mvn dependency:tree | grep javax

А потом:

  • принудительно укажите Jakarta-совместимые версии;

  • явно исключите старые транзитивные зависимости.

⚠️ То, что работало в 3.x, может вдруг сломаться в 4.0.

2️⃣ Spring Security конфигурация перестала компилироваться (или ещё хуже: незаметно изменила поведение)

Симптом
Security конфигурация компилируется, но аутентификация работает иначе.

Spring Security теперь требует явно прописывать всю конфигурацию.

Что сломалось:

  • удалены deprecated DSL;

  • изменены значения по умолчанию (особенно CSRF и управление сессиями);

  • кастомные фильтры больше не регистрируются автоматически.

Решение

Переходите на явные бины SecurityFilterChain и прекращайте полагаться на дефолтные значения.

@Bean
SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
    http
        .csrf(csrf -> csrf.disable())
        .authorizeHttpRequests(auth -> auth.anyRequest().authenticated());
    return http.build();
}

⚠️ Неявные security конфигурации исчезли и теперь всё нужно указывать явно.

3️⃣ Привычные стартеры внезапно пропали

Симптом
Приложение не запускается из-за отсутствующих бинов.

Некоторые Spring Boot стартеры были:

  • переименованы

  • разделены

  • или полностью удалены

Особенно это касается:

  • observability

  • расширений actuator

  • устаревших интеграций

Решение

Проверьте ваши стартеры вручную. Не доверяйте старому списку.

mvn dependency:tree | grep spring-boot-starter

Замените удалённые стартеры на:

  • явные библиотеки

  • или новые модульные альтернативы

4️⃣ Тесты отвалились из-за незаметного изменения версии Java

Симптом
Тесты падают локально, но проходят в CI (или наоборот).

Spring Boot 4.0 активнее толкает к современной Java (Java 21+).

Что сломалось:

  • образы Testcontainers

  • совместимость ByteBuddy / Mockito

  • JVM флаги удалены или игнорируются

Решение

  • Выровняйте локальную версию Java, версию Java в CI и Maven toolchains

  • Агрессивно обновляйте библиотеки для тестирования

💬 Комментарий Java Insider

Автор пишет, что Spring Boot 4.0 повысил минимальные требования к Java, но это изменение может пройти незаметно. В результате у вас локально, в CI и в Docker-образах Testcontainers могут быть разные версии.

Из-за этого тесты ведут себя по-разному в разных окружениях, и вы тратите часы на поиски бага в Spring, хотя проблема просто в рассинхронизации версий JVM.

5️⃣ Actuator и метрики изменили поведение без ошибок

Симптом
Всё работает, но метрики исчезли.

Spring Boot 4 рефакторит дефолты observability:

  • endpoints отключены по умолчанию

  • переименованы метрики

  • изменены правила экспозиции

Решение

Явно объявите экспозицию actuator:

management:
  endpoints:
    web:
      exposure:
        include: health,info,metrics

Когда мы поняли, что для миграции нужен чеклист

После исправления третьей критической проблемы мы остановились и осознали:

Это не одна миграция — это паттерн.

Поэтому мы задокументировали каждое важное изменение, каждое исправление и каждый подводный камень в структурированный чеклист миграции.

👉 Полный гайд по миграции Spring Boot 3.x → 4.0

Он включает:

  • шаги аудита зависимостей

  • паттерны миграции security

  • исправления для тестов и CI

  • изменения в actuator и observability

Что было самым странным, что сломалось во время вашей миграции? Давайте обменяемся опытом 👇

Больше материалов о Spring Boot, Java и backend-разработке ищите в нашем телеграм-канале Java Insider.