【问题标题】:Disable Spring Boot HibernateJpaAutoConfiguration but still getting a related error禁用 Spring Boot HibernateJpaAutoConfiguration 但仍然出现相关错误
【发布时间】:2018-01-12 04:53:16
【问题描述】:
@SpringBootApplication(exclude = {
    HibernateJpaAutoConfiguration.class, JndiConnectionFactoryAutoConfiguration.class, XADataSourceAutoConfiguration.class,
    JndiDataSourceAutoConfiguration.class, ...)

像上面的代码一样,我禁用了 Spring Boot 提供的几乎所有自动配置类,因为我想让我的 rpc 框架更干净,但是我不断收到这个错误,这太奇怪了,我看看 HibernateJpaAutoConfiguration 构造函数,它需要一个数据源 bean,但我已经禁用了 HibernateJpaAutoConfiguration,为什么它还在创建这个 bean?

上下文初始化期间遇到异常 - 取消刷新尝试:org.springframework.beans.factory.UnsatisfiedDependencyException:创建名称为“org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration”的bean时出错:通过构造函数参数表示的不满足依赖关系0;嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException:没有“javax.sql.DataSource”类型的合格 bean 可用:预计至少有 1 个有资格作为自动装配候选者的 bean。依赖注释:{}

【问题讨论】:

    标签: java hibernate spring-boot spring-data-jpa


    【解决方案1】:

    当您禁用 HibernateJpaAutoConfiguration 时,您必须在配置中手动提供 DataSource bean,否则 Spring 无法在应用程序上下文中找到它并抛出您遇到的异常

    【讨论】:

    • 看一下HibernateJpaAutoConfiguration构造函数,它需要一个Datasource bean,但是我已经禁用了HibernateJpaAutoConfiguration,为什么还要创建这个bean?
    【解决方案2】:

    问题已解决!事实证明,我的类路径中有两个测试主类,当我删除一个时,问题消失了,太奇怪了。两个 Main 类如下所示:

    @XproPluginApplication
    public class ServerMain {
    
        public static void main(String[] args) throws Exception {
            ApplicationContext context = SpringApplication.run(ServerMain.class);
        }
    }
    
    @XproPluginApplication
    public class ClientMain {
    
        public static void main(String[] args) throws Exception {
            ApplicationContext context = SpringApplication.run(ClientMain.class);
    
            Invoker invoker = context.getBean(Invoker.class);
            while (true) {
                try {
                    invoker.invokeVoidAsyncCallback();
    
                    TimeUnit.SECONDS.sleep(5);
                } catch (Exception e) {
                    e.printStackTrace();
                    TimeUnit.SECONDS.sleep(5);
                }
            }
        }
    }
    
    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    @SpringBootApplication(exclude = { HibernateJpaAutoConfiguration.class...}
    @EnableDiscoveryClient
    @Import(XproPluginRegistrar.class)
    public @interface XproPluginApplication {
        RunMode runMode() default RunMode.SERVER;
    }
    

    【讨论】:

      【解决方案3】:

      看来您不需要数据源。 从自动配置过程中删除它:

      @EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
      

      【讨论】:

        猜你喜欢
        • 2016-09-27
        • 2016-10-20
        • 2021-03-01
        • 2021-07-08
        • 2016-07-07
        • 2021-09-21
        • 1970-01-01
        • 1970-01-01
        • 2019-07-09
        相关资源
        最近更新 更多