Java 从spring boot 1.5迁移到2.0后,无任何uchbeandefinitionException

Java 从spring boot 1.5迁移到2.0后,无任何uchbeandefinitionException,java,spring,hibernate,spring-boot,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 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>
SessionFactory bean需要存在于包t.i.config.multitenancy中的MultiTenantConnectionProvider:

package t.i.config.multitenancy;

@Component
public class MultiTenantConnectionProviderImpl implements MultiTenantConnectionProvider {

   ... code there ...

}
尽管配置类上有注释:

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 ...

    }
}
@SpringBootApplication(scanBasePackages=“t.i.config”)

Spring在运行时引发异常:

NoSuchBeanDefinitionException:没有“org.hibernate.engine.jdbc.connections.spi.MultiTenantConnectionProvider”类型的合格bean可用

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

也许这并不重要,但我将应用程序作为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的回答,它才起作用

您可以尝试基本方法,将应用程序类留在项目的根级别,以便
@SpringBootApplication
对它旁边的所有包和所有子包进行组件扫描

或者您可以尝试使用组件扫描注释,如:

@ComponentScan(basePackages = {
    "t.i.DAO", 
    "t.i.SERVICES",
    "t.i.config"
})
@SpringBootApplication
public class ApiApplication { 
    // ...
}

由于您要在多租户应用程序中定义自己的数据源,因此不能让Spring Boot按照数据源属性中的定义自动配置数据源并连接到数据库

你应该把这个班排除在外

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

@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })

我最近创建了一个基于SpringBoot2(带Hibernate)和SpringSecurity5的数据库/租户多租户web应用程序,并提供了完整的源代码。如果有帮助,请告诉我。

你是。在配置和托管依赖项方面,我们都非常努力地使事情变得非常复杂,并围绕Spring Boot工作。在JPA上使用普通hibernate的原因是什么?比起使用JPA和Hibernate作为提供者,它能给你带来什么呢?我使用Hibernate会话而不是JPA,因为我从2年前就开始了这个项目,很多查询都是用HQL编写的(没有JPQL)。据我所知,JPQL不支持某些HQL功能,这就是为什么我需要Hibernate会话来进行HQL查询…这取决于您使用的查询。尽管如此,在使用JPA时,您仍然可以使用普通的
会话。把它打开。这样,您就可以让SpringBoot自动配置您的hibernate,并且仍然可以让代码与遗留API一起工作。基本上这两个世界都是最好的,你有一个迁移策略。谢谢,它很有效!春天能找到我的豆子!但现在我又遇到了另一个问题:每个http调用上都有405个错误。请友好地投票,如果它有效,请接受我的答案:)并且对405个错误提出另一个问题,我非常确定我对发生了什么有一个很好的想法。我也会回答这个问题,只是提供一些细节,发布错误,并在评论中链接问题。你是对的!我是stackoverflow的初学者,再次感谢,我支持你的回答,但我仍然没有15个声誉,所以现在无法看到支持。我在那里发布了我的新问题: