我正在将应用程序从Sping Boot 2.6升级到3.1。该应用程序是一个模块化的gradle项目,并利用Spring的自动配置。
有一个应用程序依赖于几个模块,所有这些模块都通过META-INF/spring.factories
类提供自己的自动配置。它们指向一个配置类,该配置类将初始化该模块的代码并设置相应的组件扫描。
这在Sping Boot 2中运行得很好。正如更新手册所建议的,我已经将这些文件迁移到META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
,并在每行插入一个单独的配置。配置类本身注解为AutoConfiguration
,主类注解为@ImportAutoConfiguration
。
但是,当我启动应用程序时,Autoconfiguration似乎没有被选中,并且我得到了关于缺少bean的启动错误。我验证了10次,它是正确的文件名和引用正确的类。
示例案例:
admin-panel模块中的main方法:
package de.herakles.platform.krakenadminpanel;
// import
@SpringBootApplication
@EnableWebMvc
@ImportAutoConfiguration
public class KrakenAdminPanel {
public static void main(String[] args) {
SpringApplication.run(KrakenAdminPanel.class, args);
}
}
Gradle依赖于一个名为 platform-dialect 的模块,该模块包含一个SupplierService
类型的bean。
在模块platform-dialect中,我有这个文件:platform-dialect/src/main/resources/META-INF/spring /org.springframework.boot.autoconfigure.AutoConfiguration.imports
正好包含这一行:
de.herakles.platform.kraken.platformdialect.KrakenPlatformDialectConfiguration
配置类如下所示:
package de.herakles.platform.kraken.platformdialect;
//imports
@AutoConfiguration
@EnableJpaRepositories(basePackages = "de.herakles")
@EntityScan(basePackages = "de.herakles")
@ComponentScan(basePackageClasses = KrakenPlatformDialectConfiguration.class)
public class KrakenPlatformDialectConfiguration {
}
在该模块中,有一个de.herakles.platform.kraken.platformdialect.supplier.SupplierService
,它被注解为@Service,并且应该由组件扫描(在升级之前)拾取。我得到的错误消息是:
- de.herakles.platform.krakenadminpanel.dataengineering中构造函数的参数0。VariantController需要类型为“de.herakles.platform.kraken.platformdialect.supplier.SupplierService”的Bean,但找不到该Bean。*
我真的很挣扎-尝试了所有的建议,我可以找到没有工作。我也缺乏任何关于如何进一步调试问题的指示,因为关于新的自动配置系统的文档和信息不是很密集。因此,我将非常感谢一个解决方案或提示如何调试这个问题。
谢谢马蒂亚斯
1条答案
按热度按时间f4t66c6m1#
问题出现在Gradle构建中:虽然单个jar包含新的AutoConfiguration.imports文件,但这些jar并没有放在spring Boot 插件创建的uber jar中-仍然有没有AutoConfiguration. imports的旧版本。
清理所有构建文件夹解决了问题。