Недавно решил обновить основной свой проект с Java 17 на 25, и, соответственно, перейти на новый Spring Boot 4. Опишу нюансы перехода со Spring Boot 3 на Spring Boot 4 в моём проекте, и то с чем пришлось столкнуться.
- Новая логика работы аннотации @GeneratedValue в Hibernate
Теперь, если у тебя поле id помечено аннотацией @GeneratedValue, то ты не должен нигде в коде присваивать этому идентификатору своё значение. Иначе Hibernate подумает, что сущность уже присутствует в базе данных, и выбросит ошибку, когда не найдёт её там.
Поэтому если у вас где-то написан код криво (а я считаю, что это криво, когда вы сами присваиваете значение этому полю), то будут проблемы. У меня было такое в одном месте — кто-то другой писал код, и в тестах было достаточно много случаев, где я этому полю присваивал какие-то значения.
- Переход на Jackson 3
У большинства аннотаций пакет изменился, но некоторые остались в старом. Тут нужно быть очень внимательным. Переделывать пришлось много. К тому же теперь по-другому создаётся ObjectMapper, его тоже потребуется переделать.
Отдельная история — мапперы для LocalDateTime и Date.
Раньше мы использовали JSR-310 для работы с новым временным API. С переходом на Jackson 3 поддержка JSR-310 стала встроенной, и отдельная зависимость больше не нужна. Однако чтобы сохранить уже существующую логику сериализации в приложении (форматы, часовые пояса и т.д.), пришлось немного подправить собственные сериализаторы.
- Дополнительные моменты (если есть XML)
Если у тебя в проекте дополнительно присутствует XML-маппер, то его тоже нужно будет переделывать. И опять же, по-другому нужно исключить его из конвертеров сообщений, чтобы у тебя случайно контроллеры не начали отвечать XML-форматом.
- Проблема с десериализацией Pair из пакета spring util
Если у тебя в JSON когда-либо сериализовывался Spring-класс Pair, то теперь он не сможет десериализоваться корректно, потому что у Pair исчез конструктор без аргументов. Поэтому потребуется добавить Jackson Mixin и прописать логику для создания Pair для корректной десериализации.
- Зависимость Liquibase: теперь через Spring Boot Starter
Раньше была подключена только liquibase-core. После перехода пришлось заменить её на spring-boot-starter-liquibase. Потому что в Spring Boot 4 изменился подход к автоматической конфигурации миграций. Старый liquibase-core без стартера теперь не тянет нужные бины и настройки. Пришлось обновить, чтобы всё запускалось как раньше.