我们正在将微服务应用程序从 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 迁移自动配置的更改,但在这种情况下,我不确定它是否适用,因为此类从未自动配置过。
尽管我仍然不知道 Spring Boot 代码中问题的确切根源,但我找出了导致此行为的原因。
这些 bean 被设计为在特定的 spring 配置文件处于活动状态时不会创建。
发生这种情况的测试正在使用该特定配置文件。我一开始没有注意到这一点,所以我没有意识到从未为这些测试创建 bean。
Spring Boot 2.7 不在乎,我猜是因为需要这些 bean 的类没有用于这些测试。
出于某种原因,Spring Boot 3.2.4 现在拒绝加载这些测试的上下文,除非创建了 Bean。