Требования к свойствам, разрешаемым с помощью @ConfigurationProperties - PullRequest
0 голосов
/ 26 марта 2019

Я использую 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 перебирает: enter image description here

Когда 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...