Новый функционал

Кэширование при авторизации через UserCache

Примечание: этот функционал был в прошлых версиях Spring Boot, просто мы добавляем его в наш проект. Реализовать кэширование авторизованного пользователя можно через @Caching / @CacheEvict или использовать механизм UserCache, который дает бОльшую гибкость. В проекте у нас уже есть зависимость Caffeine Cache и в application.yaml уже объявлен cache-names: users. Добавим UserCache (stackoverflow):
  • В SecurityConfig объявляем отдельный бин UserCache, реализованный через стандартный SpringCacheBasedUserCache - обертку для UserDetails над текущей реализацией кэширования.
  • UserDetailsService обертываем CachingUserDetailsService, в который сеттим userCache()
  • Обязательный пункт - устанавливаем, что после запроса креденшелы в экземпляре UserDetails не чистятся (он находится в кэше, с обнуленным паролем следующие запросы не пройдут)
  • Используя бин UserCache, инвалидируем в контроллерах пользователя в кэше при его изменении
  • Пришлось исправить баг в тестах: в реализации AdminUserController#delete для очистки кэша мы теперь достаем пользователя по id и, т.к. все тесты в AbstractControllerTest оборачиваются в @Transactional чтобы база не менялась, в тесте AdminUserControllerTest#delete пользователь остается в кэше транзакции теста и новый запрос findById(USER_ID) не выполняется (можно проверить, откатив изменения в тесте). Решил через получения пользователя через findByEmailIgnoreCase.

API Versioning

В Spring 7 появилась долгожданная официальная поддержка нативного API Versioning. Добавим ее в наш проект:

Apply patch boot4_2_version.patch
  • Вместо application.yaml оказалось удобнее все сконфигурировать в WebConfig, версии и значение заголовка можно вынести в константы. Чтобы страничка Swagger REST OpenAPI не бросала MissingApiVersionException, нужно в конфигурацию добавить .setVersionRequired(false) или .setDefaultVersion(CURRENT_VERSION) (или обе настройки).

  • В @RequestMapping контроллеров добавляем версию.
  • Без setVersionRequired / setDefaultVersion тесты также не будут проходить. Тк. в проекте все запросы в тестах проходят через AbstractControllerTest#perform, в соответствии с Testing versioned APIs, сделаем реализацию простым добавлением заголовка версионирования в этом методе.
  • Проверьте, что теперь во всех запросах Swagger теперь автоматически появилось версионирование:

Maven 4

В IntelliJ IDEA 2025.2 уже появилась поддержка Maven 4, попробуем использовать его для сборки.
Apply patch boot4_3_maven4.patch
  • В Apache Archive Distribution Directory находим и скачиваем последнюю версию, например в 4.0.0-rc-5/binaries/.
  • В pom.xml меняем modelVersion на 4.1.0
  • Меняем в проекте настройки Maven и пересобираем проект. При сборке выходит предупреждение:
    Create a .mvn directory in the root directory or add the root="true" attribute on the root project's model to identify it.
    У нас проект не многомодульный, добавляем в заголовок root="true"
Это все, мы готовы к Maven 4 GA релизу.

Присоединяйся к нашей группе Java-разработчиков в Telegram

Большая просьба поддержать звездочками этот мини-курс на Stepik