父配置类的Bean未创建

问题描述 投票:0回答:1

我们正在将微服务应用程序从 Spring Boot 2.7 迁移到 Spring Boot 3.2.4。

我们有一个导入到我们所有微服务中的库。在这个库中,有一个抽象类定义了一些bean,并且应该由所有微服务实现。它还具有一些允许通过覆盖这些 bean 来配置它们的方法。

库抽象类示例

public abstract class ConfigurationAbstractClass{
  @Bean
  protected ConfigurableBean configure(){
    *ConfigurableBean creation code*

    customConfiguration(configurableBean);

    *other configuration logic*
  }

  protected void customConfiguration(ConfigurableBean configurableBean){
  }

  @Bean
  public CommonBean  commonBean(){
    *CommonBean creation and return*
  }
}

子类可以重写 customConfiguration 方法,以便 ConfigurableBean 在每个微服务中拥有自定义配置。

微服务实现类示例

@Configuration
public class ConfigurationImplementationClass extends ConfigurationAbstractClass {

  @Override
  protected void customConfiguration(ConfigurableBean configurableBean){
    *configuration code*
  }
}

然后在每个微服务的代码和测试中自动装配这些 Bean。

在 Spring Boot 2.7 中,所有 Bean 均已成功创建。

在 Spring Boot 3.2.4 中,代码可以编译,但我们的测试失败,并显示错误,指出找不到 CommonBean 类型的 Bean。

我已经看到了有关从 spring.factories 迁移自动配置的更改,但在这种情况下,我不确定它是否适用,因为此类从未自动配置过。

java spring spring-boot spring-boot-3 spring-boot-configuration
1个回答
0
投票

尽管我仍然不知道 Spring Boot 代码中问题的确切根源,但我找出了导致此行为的原因。

这些 bean 被设计为在特定的 spring 配置文件处于活动状态时不会创建。

发生这种情况的测试正在使用该特定配置文件。我一开始没有注意到这一点,所以我没有意识到从未为这些测试创建 bean。

Spring Boot 2.7 不在乎,我猜是因为需要这些 bean 的类没有用于这些测试。

出于某种原因,Spring Boot 3.2.4 现在拒绝加载这些测试的上下文,除非创建了 Bean。

© www.soinside.com 2019 - 2024. All rights reserved.