使用@ConfigurationProperties解析的属性的要求

时间:2019-03-26 09:39:50

标签: java spring spring-boot azure-keyvault

我正在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迭代通过的所有可用属性源: enter image description here

Spring调用propertySource.getProperty(key);时,密钥为sampleProperty,该密钥不存在,只有prefix-samplePropertyprefix.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的东西。

0 个答案:

没有答案