Я использую Azure KeyVault в Spring Boot для разрешения секретов. Хранилище имеет ограничение в том, что свойства могут быть разделены только -
. Я использую azure-keyvault-secrets-spring-boot-starter
, и эта зависимость заменяет тире точками, чтобы иметь возможность хранить такие секреты, как spring-datasource-url
.
В моем проекте мы используем довольно сложное KeyVault, и для этого требуется, чтобы мы указали префикс свойств, чтобы знать, кому они принадлежат. Поэтому я храню свою собственность как prefix-sampleProperty
в хранилище. Стартер хранилища позволяет использовать это свойство двумя различными способами:
@Value("${prefix.sampleProperty}"
@Value("${prefix-sampleProperty}"
Однако, поскольку моя часть приложения заинтересована только в одном пространстве имен в этом хранилище (пространство имен prefix
), я хочу использовать аннотацию Spring @ConfigurationProperties(prefix = "prefix")
и просто не обращать внимания на ее запись для каждого свойства:
@Value("${sampleProperty}"
Однако это не работает и завершается ошибкой:
Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'sampleProperty' in value "${sampleProperty}"
Я проверил, что мои переменные окружения в Spring содержат свойство, и оно существует в двух формах, оба с .
(точка) и -
(тире). Они существуют в propertySource -> source -> propertySources -> propertySourcesList -> KeyVaultPropertySource
, когда Spring пытается разрешить значение из здесь .
Все доступные источники свойств, через которые Spring перебирает:
Когда Spring вызывает propertySource.getProperty(key);
, ключ sampleProperty
, который не существует, только prefix-sampleProperty
и prefix.sampleProperty
do.
Это, в свою очередь, вызывает этот метод , и здесь secretName
также sampleProperty
, которого нет на карте в этом классе.
Итак, мои вопросы:
Существуют ли какие-либо особые требования для разрешения свойств с аннотацией уровня класса ConfigurationProperties
, кроме тех, которые должны быть разделены .
?
Существуют ли какие-либо особые требования к тому, как добавлять свойства в среду Springs, чтобы иметь возможность разрешать их с помощью ConfigurationProperties
?
Это ошибка в реализации источника свойств Azure KeyVault?
Edit:
@Getter
@Component
// @EnableConfigurationProperties // also tried here, not working
@ConfigurationProperties(prefix = "prefix")
public class SampleConfiguration {
private String sampleProperty;
}
Я также добавил @EnableConfigurationProperties
в том же месте, где я добавил @SpringBootApplication
. Вот как я подключаю конфигурацию:
@Configuration
// @EnableConfigurationProperties(DataLakeConfiguration.class) // also tried, no difference. also removed autowired
public class AzureBeanConfiguration {
@Autowired
public AzureBeanConfiguration(final SampleConfiguration configuration) {
this.configuration = configuration;
}
@Bean
public ADLStoreClient getDataLakeClient() {
// All properties on configuration object is null here
}
}
Если я вместо этого использую это, это работает:
@Getter
@Configuration
public class SampleConfiguration {
@Value("${prefix.sampleProperty}") // or prefix-sampleProperty
private String sampleProperty;
}
Редактировать 2:
Класс конфигурации помечен:
@Getter
@Setter
@Configuration
@ConfigurationProperties(prefix = "prefix")
public class SampleConfiguration {
private String sampleProperty;
}
Я устанавливаю точку останова здесь , и когда я нажимаю на нее, параметр name
равен prefix
. Я никогда не получаю ничего подобного prefix.sampleProperty
или что-либо, содержащее этот ключ, ничего похожего на имя sampleProperty
.