【发布时间】: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