Что нового?
Spring Boot 4 и Spring Framework 7:
Новый функционал кратко и доступно описан здесь: Spring Boot 4 и Spring Framework 7: Ключевые фичи и изменения. Перечислим главное:
Spring Boot 4
Поддержка JDK 17/25
Совместимость с Jakarta EE 11
Поддержка Kotlin 2.2
Улучшенные Buildpacks и сборка Docker-образов, Интеграция Micrometer 2.x и OpenTelemetry
Обновления Spring Boot CLI, новые эндпоинты в Actuator, улучшенное управление свойствами и профилями
Spring Security 7, улучшенная интеграция с OAuth 2.2 и OIDC, улучшенная криптография
Начальная поддержка интеграции со Spring AI, улучшенный API для “подсказок” GraalVM
Spring Framework 7
Поддержка Optional в SpEL
@Retryable, @ConcurrencyLimit, @EnableResilientMethods
Конфигурация HTTP-клиентов с помощью @ImportHttpServices
Поддержка InputStream/OutputStream в HTTP-клиентах
Новый JmsClient и улучшения в JdbcClient
Централизованная конфигурация HTTP-конвертеров
Новый RestTestClient для тестирования REST API
Улучшенный PathPattern
Удаленный и deprecation API
Дополнительно можно посмотреть:
Java 25
Вышла Java 25. Установите OpenJDK 25 (не забудте поменять SDK в Project Structure... и сделать mvn clean + Refresh). При запуске Maven не из IDE нужно:
или поменять
JAVA_HOMEили поправить переменные окружения в /apache-maven/bin/mvn[.cmd]
Миграция
Основной документ миграции: Spring Boot 4.0 Migration Guide
Репозиторий GitHub (ветка boot4). Склонировать ветку миграции можно так:git clone --branch boot4 https://github.com/JavaOPs/bootjava
В склонированном проекте разберем все изменения коммита Migrate to spring boot 4 (удобнее всего смотреть изменения в IDE):

Начнем с pom.xml:
В
propertiesобновляем Java на 25 и поднимаем версии до последних в Maven Central RepositoryВ конфигурации Jackson обновилась зависимость jackson-datatype-hibernate для для обнуления LAZY полей при сериализации в JSON (урок 7 курса BootJava). Новый Spring Boot по умолчанию использует Jackson 3 (group ID и пакеты изменились с
com.fasterxml.jacksonнаtools.jackson), однако Jackson 2 остается в зависимостяхspringdoc-openapi-starter-webmvc-ui, поэтому будьте аккуратны с импортами - не изменились только пакетыjackson-annotations.Зависимость
findbugsдля удаления WARNING при компиляции больше не нужна.Spring Boot поменялась «модуляризация» автоконфигураций, см. Spring Boot 4. Новые модули. Зачем? Для тестов нам понядобятся новые зависимости:
spring-boot-starter-webmvc-test(stackoverflow) иspring-boot-starter-security-testвместоspring-security-test(stackoverflow)Для обработки
lombokвannotationProcessor, теперь нужно его явно конфигурировать вmaven-compiler-plugin(раньше было достаточно иметь в зависимостях). Зато вspring-boot-maven-pluginуже не надо исключать зависимостиoptionalиcompileвручную, чтобы они не попали в финальный jar - они исключаются автоматически.
Jackson 3
Кроме новой зависимости в pom.xml поменялось:
Конфигурирование в
AppConfigтеперь делается черезJsonMapper.builder(), поэтому настройкиjackson.visibility(JSON сериализацию/десериализацию по полям) изapplication.yamlтакже делаем программно вAppConfig#objectMapperВ
JsonUtilпоменялись импорты иIOExceptionзаменил наJacksonException.
Прочие изменения
Раньше было большое количество реализаций @NotNull annotation. В новых версиях принято использовать Null Safety with JSpecify. Подробнее здесь: Можно просто так взять и добавить поддержку проверки на Null
@Deprecated HttpStatus.UNPROCESSABLE_ENTITY / status().isUnprocessableEntity()заменили наHttpStatus.UNPROCESSABLE_CONTENT / status().isUnprocessableContent()В
application.yamlнастройкиserver.servletпереместились вspring.servlet
Это все - проект мигрирован!
API Versioning
В Spring 7 появилась долгожданная официальная поддержка нативного API Versioning. Добавим ее в наш проект (ветка boot4patched, коммит boot4_2_version):
Вместо
application.yamlоказалось удобнее все сконфигурировать вWebConfig, версии и значение заголовка можно вынести в константы. Чтобы страничка Swagger REST OpenAPI не бросалаMissingApiVersionException, нужно в конфигурацию добавить.setVersionRequired(false)или.setDefaultVersion(CURRENT_VERSION)(или обе настройки).В
@RequestMappingконтроллеров добавляем версию.Без
setVersionRequired / setDefaultVersionтесты также не будут проходить. Тк. в проекте все запросы в тестах проходят черезAbstractControllerTest#perform, в соответствии с Testing versioned APIs, сделаем реализацию простым добавлением заголовка версионирования в этом методе.Проверьте, что теперь во всех запросах Swagger теперь автоматически появилось версионирование:

Также в проект добавлен функционал кэширование при авторизации через UserCache (он был в прошлых версиях Spring Boot) и проверка работы на Maven 4.
Вы можете разобрать этот функционал проекта самостоятельно или посмотреть на сайте этого мини-курса.
Успехов с Java! Буду рад конструктивным комментариям.
aleksandy
"Автор онлайн обучения Java" не знаком с плагином, позволяющим этого не делать руками?
gkislin Автор
Не знал, спасибо, посмотрю. Статейку на Хабре нашел: https://habr.com/ru/articles/647831/