Как использовать записи для @ConfigurationProperties в Spring Boot 2.6.4 (класс может быть не окончательным)

У меня есть довольно ванильное Java-приложение Spring Boot v2.6.4, использующее Java 17.

Я пытаюсь заставить записи работать для моего @ConfigurationProperties, но без особого успеха.

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.ConstructorBinding;
import org.springframework.context.annotation.Configuration;

@Configuration
@ConfigurationProperties(prefix = "custom")
@ConstructorBinding
public record CustomConfigProperties(String path) { }

Это не удается с: org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: @Configuration class 'CustomConfigProperties' may not be final. Remove the final modifier to continue.

Очевидно, записи неявно являются окончательными, поэтому я в тупике. Никакое гугление не дает ничего полезного. Самый близкий, который я смог найти, был этот вопрос ТАК, но на самом деле он не имеет прямого отношения. На самом деле у комментатора там та же проблема, что и у меня)

Я был бы признателен за предложение улучшить сообщение, а не за понижение и голосование, чтобы закрыть. Это действительно состояние этого сообщества сейчас?

BoomShaka 22.03.2022 20:15
2
1
74
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Это работает, если я явно аннотирую свой основной класс приложения:

@ConfigurationPropertiesScan

Что нелепо, поскольку старый добрый стиль класса работает без этой аннотации.

Ответ принят как подходящий

@Configuration следует использовать в классе, который определяет bean-компоненты с помощью @Bean методов. Аннотирование с помощью @Configuration запускает создание прокси-сервера CGLib для перехвата вызовов между этими @Bean методами. Именно эта попытка проксирования терпит неудачу, потому что запись неявно является окончательной.

Вы должны удалить @Configuration из своей записи, а затем включите свою запись @ConfigurationProperties, используя @ConfigurationPropertiesScan или @EnableConfigurationProperties(CustomConfigProperties.class). Вы также можете удалить @ConstructorBinding, поскольку записи неявно связаны с конструктором. @ConstructorBinding нужно использовать только в записи, если запись имеет несколько конструкторов, и вам нужно указать, какой конструктор следует использовать для привязки свойства.

Спасибо, это полезная информация. Небольшое замечание: я считаю, что это @ConfigurationPropertiesScan не @ConfigurationPropertyScan

BoomShaka 23.03.2022 14:03

Ты прав. Исправлено.

Andy Wilkinson 23.03.2022 14:24

Другие вопросы по теме

Похожие вопросы

Как использовать внедрение конструктора
Я использую платформу Java Spring для сопоставления данных из части моих данных, и моя переменная пути не даст мне доступа к каким-либо данным
Как я могу получить сегодня предметы с JPQL
Он возвращает ноль из моего репозитория с UUID, первичный идентификатор
Включен ли RestTemplate по умолчанию https
Как получить один экземпляр зависимости, в то время как он внедряется несколько раз в разные классы?
Существуют встроенные таблицы, созданные пакетным заданием spring в H2, такие как job_instance и т. д. Как мы можем добавить префикс к этим таблицам, используя файл свойств?
Найдено 0 интерфейсов репозитория JPA после того, как я запустил свое весеннее загрузочное приложение
Передача набора идентификаторов или набора объектов в качестве данных в DTO в Spring Boot?
Spring 5: может ли ChainFileListFilter обрабатывать файлы в указанном порядке сортировки?