Spring Boot и Azure: инициализировать bean-компонент перед автонастройкой

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

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

Чтобы подключиться к Key Vault, AzureConfigBootstrapConfiguration ищет KeyVaultCredentialProvider bean, который недоступен при загрузке:

@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);
    }

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

@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 ответа

Решение

Решение:

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

org.springframework.cloud.bootstrap.BootstrapConfiguration=\
org.davidcampos.autoconfigure.DemoConfiguration

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

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

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

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

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

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

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

Другие вопросы по тегам