我正在Spring Boot中使用Azure KeyVault来解决机密。保管库有一个限制,即属性只能用-
分隔。我正在使用azure-keyvault-secrets-spring-boot-starter
,并且此依赖项将破折号替换为点,以便能够存储诸如spring-datasource-url
之类的机密。
在我的项目中,我们使用了相当复杂的KeyVault,这要求我们给属性添加前缀以知道谁拥有它们。因此,我将财产存储为prefix-sampleProperty
到Vault中。保管库启动器使我可以通过两种不同方式使用此属性:
@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中的环境变量包含该属性,并且该属性以两种形式存在,都以.
(点)和-
(破折号)形式存在。当Spring尝试从here解析值时,它们存在于propertySource -> source -> propertySources -> propertySourcesList -> KeyVaultPropertySource
下。
Spring调用propertySource.getProperty(key);
时,密钥为sampleProperty
,该密钥不存在,只有prefix-sampleProperty
和prefix.sampleProperty
起作用。
这依次称为this method,这里的secretName
也是sampleProperty
,在该类的地图中不存在。
所以,我的问题:
除了必须用ConfigurationProperties
分隔属性以外,是否有解决使用类级注释.
的属性的特定要求?
对如何向Springs环境添加属性是否有特定要求,以便能够使用ConfigurationProperties
来解析它们?
这是Azure KeyVault属性源的实现中的错误吗?
编辑:
@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:
Config类带有以下注释:
@Getter
@Setter
@Configuration
@ConfigurationProperties(prefix = "prefix")
public class SampleConfiguration {
private String sampleProperty;
}
我设置了一个断点here,当它命中时,参数name
等于prefix
。我从没收到prefix.sampleProperty
之类的东西或包含该密钥的任何东西,没有类似名称sampleProperty
的东西。