gpt4 book ai didi

java - 如何导入来自以另一个类为条件的配置 bean 的 bean?

转载 作者:行者123 更新时间:2023-12-05 04:31:13 24 4
gpt4 key购买 nike

我在我的 Spring Boot 项目(版本 2.6.3)中使用第三方依赖项,它具有以下类:

@ConditionalOnProperty(prefix = "spring.cloud.vault", name = "enabled", matchIfMissing = true)
@AutoConfigureAfter(ApacheHttpClientAutoConfiguration.class)
@Configuration
public class VaultServiceAutoConfiguration {
// ...
}


@Configuration
@EnableConfigurationProperties({VaultServiceProperties.class})
@ConditionalOnBean(VaultServiceAutoConfiguration.class)
public class VaultServiceFacadeConfiguration {
private final VaultServiceProperties vaultServiceProperties;

@Autowired
public VaultServiceFacadeConfiguration(VaultServiceProperties properties) {
this.vaultServiceProperties = properties;
}

@Bean
@ConditionalOnMissingBean(VaultServiceFacade.class)
public VaultServiceFacade vaultServiceFacade(
@Qualifier("runtime") VaultServiceTemplate vaultServiceTemplate) {
// ...
}
}

我在 bootstrap.yml 中设置了 spring.cloud.vault.enabled=true

在我的项目中,我导入了依赖项并创建了一个组件类:

@Component
public class MyVault {
private VaultServiceFacade vaultServiceFacade;

public MyVault(VaultServiceFacade vaultServiceFacade) {
this.vaultServiceFacade = vaultServiceFacade;
}
}

为了使用 VaultServiceFacade bean,它提供了与 Hashicorp Vault 实例交互的方法。问题是我收到此错误:没有可用的“other.package.VaultServiceFacade”类型的合格 bean:预计至少有 1 个符合 Autowiring 候选条件的 bean。依赖注解:{}

我不明白为什么我会收到他的错误,因为我的主类使用 @SpringBootApplication 注释,以便启用自动配置。此外,如果我尝试注入(inject) VaultServiceAutoConfiguration bean 它会起作用:

@Component
public class MyVault {
private VaultServiceAutoConfiguration v;

public MyVault(VaultServiceAutoConfiguration v) {
this.v = v;
}
}

编辑:我确实注意到依赖项有一个包含以下代码的文件 spring.factories:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
other.package.VaultServiceAutoConfiguration

所以也许只有 VaultServiceAutoConfiguration 是自动配置的“白名单”,所以我需要了解如何允许 other.package 中的其他 bean 注入(inject)我的项目.

EDIT2:我设法通过在 MyVault 类上添加 @ComponentScan 来实现此功能:

@ComponentScan("other.package")
@Component
public class MyVault {
private VaultServiceFacade vaultServiceFacade;

public MyVault(VaultServiceFacade vaultServiceFacade) {
this.vaultServiceFacade = vaultServiceFacade;
}
}

我仍然不明白为什么 ComponentScan 只在添加到 MyVault 类时才起作用,但是如果我从 main it 类扫描这个包,它就不会工作:

@SpringBootApplication(scanBasePackages = {"other.package"})
public class Application {

// ...
}

最佳答案

@ComponentScan 之所以有效,是因为您非常直接地要求 Spring 扫描所述包以查找它直接扫描的任何 bean。

我不知道为什么 @SpringBootApplication(scanBasePackages = {"other.package"}) 不亲自尝试就无法工作,但我猜你得到的错误是 other.package beans 被创建,而不是所有其他 beans 不存在(毕竟 other.package 不是基础包)。

最后,为什么您首选的条件方法不起作用?

如果没有可使用的简化示例应用程序,则很难判断。我怀疑这是因为 VaultServiceAutoConfiguration,我创建了一个简化的项目,其中有问题的 bean 直接位于所述类中并且加载得很好。尝试将您的 VaultServiceFacade 定义移动到 VaultServiceAutoConfiguration 并删除 @AutoConfigureAfter(ApacheHttpClientAutoConfiguration.class),如果可行,您知道它在 VaultServiceFacadeConfiguration 中(或 @AutoConfigureAfter(ApacheHttpClientAutoConfiguration.class) 本身,也许是 @EnableConfigurationProperties({VaultServiceProperties.class})

此外,我使用了 application.properties 而不是 bootstrap.yml 但不太可能是这样。

请随意发送一个示例简化项目来处理和测试您的假设

关于java - 如何导入来自以另一个类为条件的配置 bean 的 bean?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71870076/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com