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
массив содержит список первоисточников для загрузки при запуске приложения. Таким образом, этот список не обязательно должен содержать все компоненты и конфигурации.