Java Spring Boot和Azure:在自动配置之前初始化bean

Java Spring Boot和Azure:在自动配置之前初始化bean,java,spring,spring-boot,azure-keyvault,azure-app-configuration,Java,Spring,Spring Boot,Azure Keyvault,Azure App Configuration,尝试设置Sprint启动应用程序以从中加载配置,并引用包含敏感信息的属性条目 使用应用程序配置工作正常,将密钥Vault引用添加到应用程序配置时会出现问题 为了连接到密钥保管库,AzureConfigBootstrapConfiguration查找加载时不可用的KeyVaultCredentialProviderbean: @Bean 公共AzureConfigPropertySourceLocator源定位器(AzureCloudConfigProperties, AppConfigProvi

尝试设置Sprint启动应用程序以从中加载配置,并引用包含敏感信息的属性条目

使用应用程序配置工作正常,将密钥Vault引用添加到应用程序配置时会出现问题

为了连接到密钥保管库,
AzureConfigBootstrapConfiguration
查找加载时不可用的
KeyVaultCredentialProvider
bean:

@Bean
公共AzureConfigPropertySourceLocator源定位器(AzureCloudConfigProperties,
AppConfigProviderProperties(appProperties、ClientStore客户端、ApplicationContext上下文){
KeyVaultCredentialProvider KeyVaultCredentialProvider=null;
试一试{
keyVaultCredentialProvider=context.getBean(keyVaultCredentialProvider.class);
}catch(名词和定义异常e){
LOGGER.error(“未能找到用于身份验证的唯一TokenCredentialProvider Bean。”,e);
if(properties.isFailFast()){
投掷e;
}
}捕获(无此项定义异常e){
LOGGER.info(“未找到TokenCredentialProvider”);
}
返回新的AzureConfigPropertySourceLocator(属性、应用属性、客户端、KeyVault凭据提供者);
}
尝试创建具有最高优先级的bean,但该bean无效:

@配置
公共类演示配置{
@豆子
@顺序(有序。最高优先级)
public KeyVaultCredentialProvider KeyVaultCredentialProvider(){
返回uri->new EnvironmentCredentialBuilder().build();
}
}
还尝试在bean上使用
@Primary
@Priority
,在
DemoConfiguration
类上使用
@AutoConfigureBefore(AzureConfigBootstrapConfiguration.class)
,但这些替代方法都不起作用

问题:
在初始化
AzureConfigBootstrapConfiguration
之前,您知道如何创建
KeyVaultCredentialProvider
bean吗?

如果不知道在您的案例中引发的确切异常和堆栈跟踪,很难给出任何提示

但是,如果在运行时它确实是一个缺少的配置,那么执行您自己的配置顺序的另一种方法是:

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

数组包含应用程序启动时要加载的主要源的列表。因此,此列表不需要包含所有组件和配置。

您在spring.factories中设置了DemoConfiguration吗

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

这样就可以找到它。

解决方案:

由于Azure应用程序配置使用BootstrapConfiguration,因此解决方案是创建
META-INF/spring.factories
文件以启用所需bean的配置,例如:

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

为什么不直接自动连接KeyVaultCredentialProvider,而不是手动获取它?@toolkit:手动获取bean是由“spring cloud azure appconfiguration config”依赖项提供的
AzureConfigBootstrapConfiguration
代码的一部分。已经尝试过了,但没有成功。调试时,它总是首先转到
sourceLocator
方法,找不到尚未初始化的
KeyVaultCredentialProvider
bean。关于错误代码,它无法建立到Azure Key Vault的连接,因为未提供所需的
KeyVaultCredentialProvider
bean。您是否能够确认KeyVaultCredentialProvider bean在应用程序生命周期内创建?在从
DemoConfiguration
创建之后,但是,
AzureConfigBootstrapConfiguration
没有对它的引用,无法建立连接。到底引发了什么异常?没有这样的定义异常吗?请提供堆栈跟踪的摘录。感谢您的帮助。已经找到了解决方案:它帮助我研究了
BootstrapConfiguration
属性,解决了这个问题!