Spring Boot и Azure: инициализировать бин перед автоконфигурацией - PullRequest
0 голосов
/ 25 февраля 2020

Попытка настроить загрузочное приложение Sprint для загрузки конфигураций из Azure Конфигурация приложения со ссылкой на запись Azure Key Vault для свойств с конфиденциальной информацией.

Использование конфигурации приложения работает правильно, и возникают проблемы, когда ссылка на хранилище ключей добавляется в конфигурацию приложения.

Для подключения к хранилищу ключей AzureConfigBootstrapConfiguration ищет компонент KeyVaultCredentialProvider, который недоступен при загрузке:

@Bean
    public AzureConfigPropertySourceLocator sourceLocator(AzureCloudConfigProperties properties,
            AppConfigProviderProperties appProperties, ClientStore clients, ApplicationContext context) {
        KeyVaultCredentialProvider keyVaultCredentialProvider = null;
        try {
            keyVaultCredentialProvider = context.getBean(KeyVaultCredentialProvider.class);
        } catch (NoUniqueBeanDefinitionException e) {
            LOGGER.error("Failed to find unique TokenCredentialProvider Bean for authentication.", e);
            if (properties.isFailFast()) {
                throw e;
            }
        } catch (NoSuchBeanDefinitionException e) {
            LOGGER.info("No TokenCredentialProvider found.");
        }
        return new AzureConfigPropertySourceLocator(properties, appProperties, clients, keyVaultCredentialProvider);
    }

Пытался создать компонент с наивысшим приоритетом, но он не работает:

@Configuration
public class DemoConfiguration {
    @Bean
    @Order(Ordered.HIGHEST_PRECEDENCE)
    public KeyVaultCredentialProvider keyVaultCredentialProvider() {
        return uri -> new EnvironmentCredentialBuilder().build();
    }
}

Также пытался использовать @Primary и @Priority на бобе и @AutoConfigureBefore(AzureConfigBootstrapConfiguration.class) на DemoConfiguration классе, но ни одна из альтернатив не работает.

Вопрос: Знаете ли вы, как создать бин KeyVaultCredentialProvider раньше AzureConfigBootstrapConfiguration инициализирован?

Ответы [ 3 ]

0 голосов
/ 25 февраля 2020

Вы установили DemoConfiguration в свои spring.factories?

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.DemoConfiguration

Это должно позволить его найти.

0 голосов
/ 25 февраля 2020

Решение:

Поскольку Azure Конфигурация приложения использует BootstrapConfiguration, решение заключается в создании файла META-INF/spring.factories, чтобы включить конфигурацию с требуемым компонентом, например:

org.springframework.cloud.bootstrap.BootstrapConfiguration=\
org.davidcampos.autoconfigure.DemoConfiguration
0 голосов
/ 25 февраля 2020

Трудно дать какие-либо подсказки, не зная точного исключения и трассировки стека, которые выбрасываются в вашем случае.

Но если это действительно отсутствующая конфигурация во время выполнения, другой способ обеспечить выполнение вашего собственного заказа из конфигураций это:

public static void main(String[] args) {
    SpringApplication.run(
       new Class[]{ YourSpringBootApplication.class,
           KeyVaultCredentialProvider.class, 
           AzureConfigBootstrapConfiguration.class // , ...
       }, args);
}

Массив Class содержит список первичных источников для загрузки при запуске приложения. Таким образом, этот список не должен содержать все компоненты и конфигурации.

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