Миграция на Spring Boot 3.1.x. Update / Fix / Refactoring
Миграция на Spring Boot 3.1.x
- Spring 6, Hibernate 6.2, Hibernate Validator 7, R2DBC 1.0, JPA 3.1, Tomcat 10
- Java 17 – минимальная версия
- Генерация нативных образов GraalVM
- Улучшения в observability через Micrometer и Micrometer Tracing
- Переход от Java EE к Jakarta EE. Jakarta EE 9 – минимальная версия, поддержка Jakarta EE 10
- В pom.xml обновляем версии Spring и Springdoc
- Мигрируем Springdoc на 2.x:
меняется зависимости и пакет
GroupedOpenApi. - Меняем зависимость jackson-datatype-hibernate5 на jackson-datatype-hibernate5-jakarta и в
AppConfigзаменяемHibernate5ModuleнаHibernate5JakartaModule - В security
antMatchersменяется наrequestMatchersи нужно явно исключать swagger-ui из авторизации. Плюс добавилась миграция на Spring Security 6 ResponseEntityExceptionHandlerтеперь поддерживает спецификацию RFC-7807 - описание ошибок, перешел на нее в исключениях. В класс описания ошибокProblemDetailможно добавлять свои поля: вGlobalExceptionHandler#handleMethodArgumentNotValid()добавил полеinvalid_params. Однако при сериализации Jackson через поля, как у нас, в ответе это поле дублируется. Пришлось делать workaround: классAppConfig.MixIn. Для обработкиAppExceptionсделал метод, возвращающийProblemDetail- В
AdminUserControllerTestне идут тесты на запросы со слешем в конце. Сделал отдельную переменнуюREST_URL_SLASH - Добавил исключения и поменял данные пользователей, как на стажировке TopJava
Apply patch 8_01_migrate_spring_boot_3_1_2
Spring Boot 3.0 Goes GA
What's New in Spring Framework 6.x
Spring Boot 3.0 Goes GA
Get ready for Spring Boot 3.0
The best way to do the Spring 6 migration
Spring Boot 3.0 Migration Guide
Spring Boot 3.1 Release Notes
Update / Fix / Refactoring
Apply patch 8_02_update_fix_refactoring
Update 05.11.24:
- Перешел на LTS JDK 21 (не забудте поменять SDK в Project Structure... и сделать mvn clean + Refresh)
- Обновил версии spring-boot-starter-parent (3.3.5), springdoc(2.6.0) и jsoup (1.18.1)
- В новой версии Hibernate
ElementCollectionдляUser.rolesне дружит с аннотациямиJoinColumnиOnDelete, удалил их
Fix:
OpenApiConfig: исправил неверное имя приложенияSecurityFilterChain: подключил неиспользованныйauthenticationEntryPoint, перенесwebSecurityCustomizer()/ignoring()вfilterChain()/permitAll()BaseEntity.id(): убрал дублирование (уже определен вdefault HasId.id()) и ненужный без HATEOASPersistable
Refactoring:
- Для средних и больших проектов более удобна организация пакетов по функционалу: сначала крупными мазками функционал, внутри него слои.
Финальный код Spring Boot 3.x (BootJava) разбил по функционалу на
app,commonиuser. Процесс творческий, на одном из проектов я попробовал использовать Spring Modulith и отказался от него, так как очень часто сущности делятся между разным функционалом и строгих границ не провести. "Суббота для человека, а не человек для субботы" в программировании звучит как: "Здравый смысл впереди строгой идеологии и архитектуры". Если будете соблюдать такую структуру в своем проекте - НЕ МЕЛЬЧИТЕ! EqualsandhashCodeдляBaseEntityсделал на основе решения от JPA Buddy- Для получения авторизованного пользователя из
AuthUserвыделил отдельныйAuthUtilкласс. RestExceptionHandler- заменил специфичноеBindException.getMessage()на "BindException".
Неверные поля есть вinvalid_paramsUser.rolesсделал ненулевымRestExceptionHandler- в вывод ошибки согласно RFC 7807 добавил title и instance(path)