【问题标题】:SpringBoot can't find EntityManagerFactory even though it is declaredSpringBoot 找不到 EntityManagerFactory 即使它被声明
【发布时间】:2022-01-27 21:02:28
【问题描述】:

我有这个 SpringBoot 代码。它同时加载 mybatis 和 hibernate。我收到关于 EntityManagerFactory 类型的 bean 不可用的异常,但它是在此处定义的。包含“xxx”的日志输出全部打印。

package com.ritchey.timesheet;


import java.sql.SQLException;
import java.util.Arrays;
import java.util.Properties;

import javax.naming.NamingException;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.sql.DataSource;

import org.apache.ibatis.session.SqlSessionFactory;
import org.hibernate.SessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.solr.SolrAutoConfiguration;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Primary;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.jndi.JndiTemplate;
import org.springframework.orm.hibernate5.HibernateExceptionTranslator;
import org.springframework.orm.hibernate5.LocalSessionFactoryBean;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.HibernateJpaDialect;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@EnableTransactionManagement
@EnableJpaRepositories(basePackages = "org.browsexml.timesheetjob")
@ComponentScan(basePackages = "org.browsexml.timesheetjob")
@MapperScan(basePackages = "com.ritchey.timesheet.mapper.TimeSheet", sqlSessionTemplateRef="TimeSheetSqlSessionTemplate")
@MapperScan(basePackages = "com.ritchey.timesheet.mapper.powercampus", sqlSessionTemplateRef="powercampusSqlSessionTemplate")
@SpringBootApplication()
public class Timesheet  {
    private static final Logger LOGGER = LoggerFactory.getLogger(Timesheet.class);
    
    static public String version = "77777";

        
    public static void main(String[] args) throws NamingException {
        SpringApplication application = new SpringApplication(Timesheet.class);

        LOGGER.info("RUN TIMESHEET ");
        ApplicationContext ctx = application.run();
        LOGGER.info("messages TIMESHEET");
        String basename = ctx.getEnvironment().getProperty("spring.messages.basename", "messages");
        LOGGER.info("basename = " + basename);
        LOGGER.info("Let's inspect the beans provided by Spring Boot:");

        String[] beanNames = ctx.getBeanDefinitionNames();
        Arrays.sort(beanNames);
        for (String beanName : beanNames) {
            LOGGER.info(beanName);
        }
        
    }
    
    @Bean
    public DataSource getCampusDatasource() throws NamingException {
        JndiTemplate jndiTemplate = new JndiTemplate();
        DataSource ds = null;
        ds = (DataSource) jndiTemplate.lookup("java:comp/env/jdbc/powerCampus");
        return ds;
    }

    
    @Bean
    @Primary
    public DataSource getTimeSheetDatasource() throws NamingException {
        JndiTemplate jndiTemplate = new JndiTemplate();
        DataSource ds = null;
        ds = (DataSource) jndiTemplate.lookup("java:comp/env/jdbc/TimeSheet");
        return ds;
    }
    
    @Bean
    public SqlSessionFactory TimeSheetSqlSessionFactory() throws Exception {
      SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
      factoryBean.setDataSource(getTimeSheetDatasource());
      return factoryBean.getObject();
    }
    
    @Bean
    @Primary
    public SqlSessionFactory powercampusSqlSessionFactory() throws Exception {
      SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
      factoryBean.setDataSource(getCampusDatasource());
      return factoryBean.getObject();
    }
    
    @Bean
    @Primary
    public SqlSessionTemplate TimeSheetSqlSessionTemplate(@Qualifier("TimeSheetSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
    
    @Bean
    @Primary
    public SqlSessionTemplate powercampusSqlSessionTemplate(@Qualifier("powercampusSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
    
    
    @Bean
    @Primary
    public SessionFactory sessionFactory() throws Exception {
        LocalSessionFactoryBean factoryBean = new LocalSessionFactoryBean();
      factoryBean.setDataSource(getTimeSheetDatasource());
      factoryBean.setMappingResources("org/browsexml/timesheetjob/model/Awards.hbm.xml",
              "org/browsexml/timesheetjob/model/HoursWorked.hbm.xml",
              "org/browsexml/timesheetjob/model/Job.hbm.xml",
              "org/browsexml/timesheetjob/model/PeopleProperties.hbm.xml",
              "org/browsexml/timesheetjob/model/CodeTerm.hbm.xml",
              "org/browsexml/timesheetjob/model/Holiday.hbm.xml",
              "org/browsexml/timesheetjob/model/PayPer.hbm.xml",
              "org/browsexml/timesheetjob/model/Awarded.hbm.xml",
              "org/browsexml/timesheetjob/model/Agreements.hbm.xml",
              "org/browsexml/timesheetjob/model/Timesheets.hbm.xml",
              "org/browsexml/timesheetjob/model/FulltimeAgreements.hbm.xml",
              "org/browsexml/timesheetjob/model/Supervisor.hbm.xml"
              );
      factoryBean.setAnnotatedClasses(org.browsexml.timesheetjob.model.WorkCode.class
              , org.browsexml.timesheetjob.model.ProcessErrors.class
              , org.browsexml.timesheetjob.model.UserLog.class
              , org.browsexml.timesheetjob.model.Properties.class
              , org.browsexml.timesheetjob.model.AuditTrail.class
              , org.browsexml.timesheetjob.model.PositionCode.class
              , org.browsexml.timesheetjob.model.Position.class
              , org.browsexml.timesheetjob.model.CodeRegions.class);
      
      Properties p = new Properties();
     
      p.setProperty("hibernate.dialect", "org.browsexml.dialect.SQLServerDialect");
      p.setProperty("hibernate.hbm2ddl.auto", "validate");
      p.setProperty("hibernate.query.substitutions", "true 1; false 0; yes 'Y'; no 'N'; year dbo.year");
      p.setProperty("hibernate.show_sql", "true");

      factoryBean.setHibernateProperties(p);
      return factoryBean.getObject();
    }
    
    @Bean
    public SessionFactory pcSessionFactory() throws Exception {
        LocalSessionFactoryBean factoryBean = new LocalSessionFactoryBean();
      factoryBean.setDataSource(getCampusDatasource());
      factoryBean.setMappingResources(
              "org/browsexml/timesheetjob/model/PeopleBasic.hbm.xml",
              "org/browsexml/timesheetjob/model/Address.hbm.xml"
              );
      
      Properties p = new Properties();
         
      p.setProperty("hibernate.dialect", "org.browsexml.dialect.SQLServerDialect");
      p.setProperty("hibernate.hbm2ddl.auto", "validate");
      p.setProperty("hibernate.query.substitutions", "true 1; false 0; yes 'Y'; no 'N'; year dbo.year");
      p.setProperty("hibernate.show_sql", "true");

      factoryBean.setHibernateProperties(p);
      
      return factoryBean.getObject();
    }
    
    @Bean(name="entityManagerFactory")
    public EntityManagerFactory entityManagerFactory() throws SQLException, NamingException {
        LOGGER.debug("xxx entity manager factory");
        HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        vendorAdapter.setShowSql(true);
        vendorAdapter.setGenerateDdl(true);
        
        HibernateJpaDialect jpd = new HibernateJpaDialect();

        LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
        factory.setJpaVendorAdapter(vendorAdapter);
        factory.setJpaDialect(jpd);
        factory.setPackagesToScan("org.browsexml.timesheetjob.model");
        factory.setDataSource(getTimeSheetDatasource());
        factory.afterPropertiesSet();

        EntityManagerFactory ret = factory.getObject();
        LOGGER.debug("xxx entity manager factory  " + ret);
        return ret;
    }

    @Bean
    public EntityManager entityManager(@Qualifier("entityManagerFactory") EntityManagerFactory entityManagerFactory) {
        LOGGER.debug("xxx entity manager");
        EntityManager ret = entityManagerFactory.createEntityManager();
        LOGGER.debug("xxx entity manager  " + ret);
        return ret;
    }

    @Bean
    public PlatformTransactionManager transactionManager() throws SQLException, NamingException {
        JpaTransactionManager txManager = new JpaTransactionManager();
        txManager.setEntityManagerFactory(entityManagerFactory());
        return txManager;
    }

    @Bean
    public HibernateExceptionTranslator hibernateExceptionTranslator() {
        return new HibernateExceptionTranslator();
    }
    
}

在 SpringBoot 中出现以下异常:

2022-01-27 14:18:23,297 错误 org.springframework.boot.SpringApplication 843 [restartedMain] 应用程序运行失败 org.springframework.beans.factory.UnsatisfiedDependencyException:创建名为“org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration$EnableWebMvcConfiguration”的bean时出错:通过方法“setConfigurers”参数0表示的依赖关系不满足;嵌套异常是 org.springframework.beans.factory.UnsatisfiedDependencyException:在类路径资源 [org/springframework/boot/autoconfigure/orm/jpa/JpaBaseConfiguration$JpaWebConfiguration.class] 中定义的名称为“openEntityManagerInViewInterceptorConfigurer”的 bean 创建错误:通过不满足的依赖关系表示方法“openEntityManagerInViewInterceptorConfigurer”参数 0;嵌套异常是 org.springframework.beans.factory.BeanCreationException:在类路径资源 [org/springframework/boot/autoconfigure/orm/jpa/JpaBaseConfiguration$JpaWebConfiguration.class] 中定义名称为“openEntityManagerInViewInterceptor”的 bean 创建错误:bean 初始化失败;嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException:没有可用的“javax.persistence.EntityManagerFactory”类型的合格 bean 在 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredMethodElement.resolveMethodArguments(AutowiredAnnotationBeanPostProcessor.java:768) 在 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredMethodElement.inject(AutowiredAnnotationBeanPostProcessor.java:720) 在 org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:119) 在 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:399) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1431) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:619) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) 在 org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) 在 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) 在 org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) 在 org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:944) 在 org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:918) 在 org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583) 在 org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:145) 在 org.springframework.boot.SpringApplication.refresh(SpringApplication.java:754) 在 org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:434) 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:338) 在 com.ritchey.timesheet.Timesheet.main(Timesheet.java:55) 在 java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) 在 java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.base/java.lang.reflect.Method.invoke(Method.java:568) 在 org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) 原因:org.springframework.beans.factory.UnsatisfiedDependencyException:在类路径资源 [org/springframework/boot/autoconfigure/orm/jpa/JpaBaseConfiguration$JpaWebConfiguration.class] 中定义的名称为“openEntityManagerInViewInterceptorConfigurer”的 bean 创建错误:通过不满足的依赖关系表示方法“openEntityManagerInViewInterceptorConfigurer”参数 0;嵌套异常是 org.springframework.beans.factory.BeanCreationException:在类路径资源 [org/springframework/boot/autoconfigure/orm/jpa/JpaBaseConfiguration$JpaWebConfiguration.class] 中定义名称为“openEntityManagerInViewInterceptor”的 bean 创建错误:bean 初始化失败;嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException:没有可用的“javax.persistence.EntityManagerFactory”类型的合格 bean 在 org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:800) 在 org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:541) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1352) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1195) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) 在 org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) 在 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) 在 org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) 在 org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) 在 org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276) 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.addCandidateEntry(DefaultListableBeanFactory.java:1598) 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1562) 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveMultipleBeans(DefaultListableBeanFactory.java:1451) 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1338) 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1300) 在 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredMethodElement.resolveMethodArguments(AutowiredAnnotationBeanPostProcessor.java:760) ...省略了23个常用框架 原因:org.springframework.beans.factory.BeanCreationException:在类路径资源 [org/springframework/boot/autoconfigure/orm/jpa/JpaBaseConfiguration$JpaWebConfiguration.class] 中定义名称为“openEntityManagerInViewInterceptor”的 bean 创建错误:bean 初始化失败;嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException:没有可用的“javax.persistence.EntityManagerFactory”类型的合格 bean 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:628) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) 在 org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) 在 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) 在 org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) 在 org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) 在 org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276) 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1380) 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1300) 在 org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:887) 在 org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791) ...省略了39个常用框架 引起:org.springframework.beans.factory.NoSuchBeanDefinitionException:没有可用的“javax.persistence.EntityManagerFactory”类型的合格bean 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:351) 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:342) 在 org.springframework.orm.jpa.EntityManagerFactoryUtils.findEntityManagerFactory(EntityManagerFactoryUtils.java:121) 在 org.springframework.orm.jpa.EntityManagerFactoryAccessor.setBeanFactory(EntityManagerFactoryAccessor.java:155) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeAwareMethods(AbstractAutowireCapableBeanFactory.java:1826) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1791) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:620) ...省略了49个常用框架

【问题讨论】:

    标签: spring-boot hibernate entitymanager


    【解决方案1】:

    通过在 application.properties 中设置克服了这个错误:

     spring.jpa.open-in-view=false
    

    不知道这里发生了什么。

    【讨论】:

      猜你喜欢
      • 2018-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-25
      • 2019-04-29
      • 2018-04-19
      • 2020-07-30
      相关资源
      最近更新 更多