У меня есть довольно ванильное 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.
Очевидно, записи неявно являются окончательными, поэтому я в тупике. Никакое гугление не дает ничего полезного. Самый близкий, который я смог найти, был этот вопрос ТАК, но на самом деле он не имеет прямого отношения. На самом деле у комментатора там та же проблема, что и у меня)
Это работает, если я явно аннотирую свой основной класс приложения:
@ConfigurationPropertiesScan
Что нелепо, поскольку старый добрый стиль класса работает без этой аннотации.
@Configuration
следует использовать в классе, который определяет bean-компоненты с помощью @Bean
методов. Аннотирование с помощью @Configuration
запускает создание прокси-сервера CGLib для перехвата вызовов между этими @Bean
методами. Именно эта попытка проксирования терпит неудачу, потому что запись неявно является окончательной.
Вы должны удалить @Configuration
из своей записи, а затем включите свою запись @ConfigurationProperties
, используя @ConfigurationPropertiesScan
или @EnableConfigurationProperties(CustomConfigProperties.class)
. Вы также можете удалить @ConstructorBinding
, поскольку записи неявно связаны с конструктором. @ConstructorBinding
нужно использовать только в записи, если запись имеет несколько конструкторов, и вам нужно указать, какой конструктор следует использовать для привязки свойства.
Спасибо, это полезная информация. Небольшое замечание: я считаю, что это @ConfigurationPropertiesScan
не @ConfigurationPropertyScan
Ты прав. Исправлено.
Я был бы признателен за предложение улучшить сообщение, а не за понижение и голосование, чтобы закрыть. Это действительно состояние этого сообщества сейчас?