java - 从 Spring Boot 1.5 迁移到 2.0 后出现 NoSuchBeanDefinitionException

标签 java spring hibernate spring-boot

今天我想从 spring boot 1.5.7 升级到 2.0.1,但在运行时 spring 找不到任何位于 ApplicationConfiguration 类之外的 spring-bean,即使我在 SpringBootApplication (scanBasePackages) 注释中提到了这些包。

这些是我的 pom.xml 文件版本的属性:

<properties>
    <hibernate.version>5.2.10.Final</hibernate.version>
    <spring.version>5.0.5.RELEASE</spring.version>
    <springSecurity.version>5.0.4.RELEASE</springSecurity.version>
    <springBoot.version>2.0.1.RELEASE</springBoot.version>
    <jackson.version>2.9.1</jackson.version>
    <slf4j.version>1.7.13</slf4j.version>
    <logback.version>1.1.3</logback.version>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

这是我的 ApplicationConfiguration 类:

package t.i.config;    

@SpringBootApplication(scanBasePackages = { 
    "t.i.DAO", 
    "t.i.SERVICES",
    "t.i.config"
})
@EnableAutoConfiguration(exclude = { 
    /*HibernateJpaAutoConfiguration.class*/ // old spring-boot 1.5 class
})
@PropertySource({ "classpath:application.mssql.properties" })
@EnableCaching
@EnableTransactionManagement
public class ApplicationConfiguration {

    @Primary
    @Autowired
    @Bean
    public LocalSessionFactoryBean sessionFactory(DataSource dataSource,
                                                  MultiTenantConnectionProvider multiTenantConnectionProviderImpl,
                                                  CurrentTenantIdentifierResolver currentTenantIdentifierResolverImpl) {

        ... code there that need MultiTenantConnectionProvider ...

    }
}

SessionFactory bean 需要 MultiTenantConnectionProvider,它存在于包 t.i.config.multitenancy 中:

package t.i.config.multitenancy;

@Component
public class MultiTenantConnectionProviderImpl implements MultiTenantConnectionProvider {

   ... code there ...

}

尽管配置类上有注释:

@SpringBootApplication(scanBasePackages = "t.i.config")

Spring在运行时抛出异常:

NoSuchBeanDefinitionException: No qualifying bean of type 'org.hibernate.engine.jdbc.connections.spi.MultiTenantConnectionProvider' available

这是一个 MultiTenantConnectionProvider 的示例,但是如果未在 ApplicationConfiguration 文件中显式声明它们,则 spring 找不到我的任何 bean(存储库和服务)。

也许这并不重要,但我将我的应用程序作为 jar 启动,并且我的类 SpringBootApplicationLauncher 处理命令行参数和上下文加载:

package t.i;

public class SpringBootApplicationLauncher {    
    public static void main(String[] args) throws Exception {
        SpringApplication springApp = new SpringApplication(new Class[]{t.i.config.ApplicationConfiguration.class});
        context = springApp.run(args);
    }
}

我哪里错了?编辑:感谢 Norbert Bicsi 的回答。

最佳答案

由于您在 Multi-Tenancy 应用程序中定义自己的数据源,因此您不能让 Spring Boot 发挥数据源属性中定义的自动配置数据源和连接到数据库的魔力。

您应该排除 DataSourceAutoConfiguration类。

因此您需要添加排除属性,如下所示:

@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })

我最近创建了一个基于 Spring Boot 2(带有 Hibernate)和 Spring Security 5 的每租户数据库 Multi-Tenancy Web 应用程序,并具有完整的源代码。 Take a look如果有帮助请告诉我。

关于java - 从 Spring Boot 1.5 迁移到 2.0 后出现 NoSuchBeanDefinitionException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49733772/

相关文章:

java - 为图像添加水印

java - 将参数传递给嵌套 Controller

java - 带有 JWT 的 Spring OAuth2 - 分离 Auth 和资源服务器时无法将访问 token 转换为 JSON

java - 为什么这个 Autowiring 字段总是为空?

java - Spring MVC 项目中的 Hibernate Validator

java - 如何将跨多个表的查询从 JDOQL 移植到 HQL

java - ConnectionService TelecomManager 未正确显示在调用历史记录中

java - hibernate java.lang.NoClassDefFoundError : org/apache/lucene/analysis/standard/StandardAnalyzer

java - 在嵌入式数据库中为 Spring Batch 创建元数据表

java - Hikari 连接不可用和意外的多池问题