2016-10-27 2 views
2

Я получаю следующее исключение при попытке загрузить мой EntityManagerFactory Bean.IllegalStateException при создании EntityManagerFactory Bean

SEVERE: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener 
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactoryBean' defined in com.global.us.app.config.PersistenceConfig: Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'annotationDrivenTransactionManager' defined in com.global.us.app.config.PersistenceConfig: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.transaction.PlatformTransactionManager]: Factory method 'annotationDrivenTransactionManager' threw exception; nested exception is java.lang.IllegalStateException: @Bean method PersistenceConfig.configureEntityManagerFactory called as a bean reference for type [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean] but overridden by non-compatible bean instance of type [com.sun.proxy.$Proxy30]. Overriding bean of same name declared in: com.global.us.app.config.PersistenceConfig 
at org.springframework.beans.factory.support.AbstractAutowirapppableBeanFactory.doCreateBean(AbstractAutowirapppableBeanFactory.java:553) 
at org.springframework.beans.factory.support.AbstractAutowirapppableBeanFactory.createBean(AbstractAutowirapppableBeanFactory.java:482) 
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) 
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) 
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) 
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) 
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1054) 
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:829) 
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:538) 
at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:444) 
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:326) 
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:107) 
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4758) 
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5184) 
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1396) 
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1386) 
at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
at java.lang.Thread.run(Thread.java:745) 
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'annotationDrivenTransactionManager' defined in com.global.us.app.config.PersistenceConfig: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.transaction.PlatformTransactionManager]: Factory method 'annotationDrivenTransactionManager' threw exception; nested exception is java.lang.IllegalStateException: @Bean method PersistenceConfig.configureEntityManagerFactory called as a bean reference for type [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean] but overridden by non-compatible bean instance of type [com.sun.proxy.$Proxy30]. Overriding bean of same name declared in: com.global.us.app.config.PersistenceConfig 
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:334) 
at org.springframework.beans.factory.support.AbstractAutowirapppableBeanFactory.populateBean(AbstractAutowirapppableBeanFactory.java:1214) 
at org.springframework.beans.factory.support.AbstractAutowirapppableBeanFactory.doCreateBean(AbstractAutowirapppableBeanFactory.java:543) 
at org.springframework.beans.factory.support.AbstractAutowirapppableBeanFactory.createBean(AbstractAutowirapppableBeanFactory.java:482) 
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) 
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) 
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) 
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) 
at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:368) 
at org.springframework.beans.factory.support.AbstractAutowirapppableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowirapppableBeanFactory.java:1123) 
at org.springframework.beans.factory.support.AbstractAutowirapppableBeanFactory.createBeanInstance(AbstractAutowirapppableBeanFactory.java:1018) 
at org.springframework.beans.factory.support.AbstractAutowirapppableBeanFactory.doCreateBean(AbstractAutowirapppableBeanFactory.java:510) 
at org.springframework.beans.factory.support.AbstractAutowirapppableBeanFactory.createBean(AbstractAutowirapppableBeanFactory.java:482) 
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) 
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) 
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) 
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) 
at org.springframework.aop.framework.autoproxy.BeanFactoryAdvisorRetrievalHelper.findAdvisorBeans(BeanFactoryAdvisorRetrievalHelper.java:92) 
at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.findCandidateAdvisors(AbstractAdvisorAutoProxyCreator.java:101) 
at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.findEligibleAdvisors(AbstractAdvisorAutoProxyCreator.java:87) 
at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.getAdvicesAndAdvisorsForBean(AbstractAdvisorAutoProxyCreator.java:69) 
at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.wrapIfNecessary(AbstractAutoProxyCreator.java:346) 
at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.postProcessAfterInitialization(AbstractAutoProxyCreator.java:298) 
at org.springframework.beans.factory.support.AbstractAutowirapppableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowirapppableBeanFactory.java:422) 
at org.springframework.beans.factory.support.AbstractAutowirapppableBeanFactory.initializeBean(AbstractAutowirapppableBeanFactory.java:1583) 
at org.springframework.beans.factory.support.AbstractAutowirapppableBeanFactory.doCreateBean(AbstractAutowirapppableBeanFactory.java:545) 
... 20 more 
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'annotationDrivenTransactionManager' defined in com.global.us.app.config.PersistenceConfig: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.transaction.PlatformTransactionManager]: Factory method 'annotationDrivenTransactionManager' threw exception; nested exception is java.lang.IllegalStateException: @Bean method PersistenceConfig.configureEntityManagerFactory called as a bean reference for type [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean] but overridden by non-compatible bean instance of type [com.sun.proxy.$Proxy30]. Overriding bean of same name declared in: com.global.us.app.config.PersistenceConfig 
at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:599) 
at org.springframework.beans.factory.support.AbstractAutowirapppableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowirapppableBeanFactory.java:1123) 
at org.springframework.beans.factory.support.AbstractAutowirapppableBeanFactory.createBeanInstance(AbstractAutowirapppableBeanFactory.java:1018) 
at org.springframework.beans.factory.support.AbstractAutowirapppableBeanFactory.doCreateBean(AbstractAutowirapppableBeanFactory.java:510) 
at org.springframework.beans.factory.support.AbstractAutowirapppableBeanFactory.createBean(AbstractAutowirapppableBeanFactory.java:482) 
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) 
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) 
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) 
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) 
at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:381) 
at com.global.us.app.config.PersistenceConfig$$EnhancerBySpringCGLIB$$9735d908.annotationDrivenTransactionManager(<generated>) 
at org.springframework.transaction.annotation.AbstractTransactionManagementConfiguration.setConfigurers(AbstractTransactionManagementConfiguration.java:73) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:498) 
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredMethodElement.inject(AutowiredAnnotationBeanPostProcessor.java:654) 
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88) 
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:331) 
... 45 more 
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.transaction.PlatformTransactionManager]: Factory method 'annotationDrivenTransactionManager' threw exception; nested exception is java.lang.IllegalStateException: @Bean method PersistenceConfig.configureEntityManagerFactory called as a bean reference for type [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean] but overridden by non-compatible bean instance of type [com.sun.proxy.$Proxy30]. Overriding bean of same name declared in: com.global.us.app.config.PersistenceConfig 
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:189) 
at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:588) 
... 63 more 
Caused by: java.lang.IllegalStateException: @Bean method PersistenceConfig.configureEntityManagerFactory called as a bean reference for type [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean] but overridden by non-compatible bean instance of type [com.sun.proxy.$Proxy30]. Overriding bean of same name declared in: com.global.us.app.config.PersistenceConfig 
at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:394) 
at com.global.us.app.config.PersistenceConfig$$EnhancerBySpringCGLIB$$9735d908.configureEntityManagerFactory(<generated>) 
at com.global.us.app.config.PersistenceConfig.annotationDrivenTransactionManager(PersistenceConfig.java:72) 
at com.global.us.app.config.PersistenceConfig$$EnhancerBySpringCGLIB$$9735d908.CGLIB$annotationDrivenTransactionManager$3(<generated>) 
at com.global.us.app.config.PersistenceConfig$$EnhancerBySpringCGLIB$$9735d908$$FastClassBySpringCGLIB$$dd07c011.invoke(<generated>) 
at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228) 
at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:356) 
at com.global.us.app.config.PersistenceConfig$$EnhancerBySpringCGLIB$$9735d908.annotationDrivenTransactionManager(<generated>) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:498) 
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:162) 
... 64 more 

Это был случай, когда у меня были две фасоль с тем же именем. Однако, когда я искал свою кодовую базу для «entityManagerFactoryBean», ссылки на нее не было.

@Bean(name="dataSource") 
public DataSource getDataSource() { 
    if (this.dataSource == null) { 
     this.dataSource = new DriverManagerDataSource(); 

     dataSource.setDriverClassName(env.getProperty(DRIVER_CLASS_NAME_PROPERTY)); 
     dataSource.setUrl(env.getProperty(DB_URL_PROPERTY)); 
     dataSource.setUsername(env.getProperty(USERNAME_PROPERTY)); 
     dataSource.setPassword(env.getProperty(PASSWORD_PROPERTY)); 
    } 
    return this.dataSource; 
} 

@Bean(name="entityManagerFactoryBean") 
public LocalContainerEntityManagerFactoryBean configureEntityManagerFactory() { 

    LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean(); 
    entityManagerFactoryBean.setDataSource(getDataSource()); 
    entityManagerFactoryBean.setPackagesToScan("com.global.us.app.model.db"); 
    entityManagerFactoryBean.setJpaVendorAdapter(new HibernateJpaVendorAdapter()); 

    Properties jpaProperties = new Properties(); 
    jpaProperties.put(org.hibernate.cfg.Environment.DIALECT, env.getProperty(org.hibernate.cfg.Environment.DIALECT)); 
    jpaProperties.put(org.hibernate.cfg.Environment.SHOW_SQL, env.getProperty(org.hibernate.cfg.Environment.SHOW_SQL)); 
    jpaProperties.put(org.hibernate.cfg.Environment.HBM2DDL_IMPORT_FILES_SQL_EXTRACTOR, env.getProperty(org.hibernate.cfg.Environment.HBM2DDL_IMPORT_FILES_SQL_EXTRACTOR)); 
    entityManagerFactoryBean.setJpaProperties(jpaProperties); 

    return entityManagerFactoryBean; 
} 

@Override 
@Bean() 
@DependsOn("entityManagerFactoryBean") 
public PlatformTransactionManager annotationDrivenTransactionManager() { 
    JpaTransactionManager jpa = new JpaTransactionManager(); 
    jpa.setEntityManagerFactory(configureEntityManagerFactory().getObject()); 
    return jpa; 
} 

Может ли кто-нибудь объяснить мне, что на самом деле означает эта ошибка? Увидев, что это не фасоль с дублирующимся именем, я смущен его формулировкой.

ответ

4

Попробуйте изменить методы для создания EntityManagerFactory и PlatformTransactionManager.

@Bean(name="entityManagerFactoryBean") 
public EntityManagerFactory configureEntityManagerFactory() { 

    LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean(); 
    entityManagerFactoryBean.setDataSource(getDataSource()); 
    entityManagerFactoryBean.setPackagesToScan("com.global.us.app.model.db"); 
    entityManagerFactoryBean.setJpaVendorAdapter(new HibernateJpaVendorAdapter()); 

    Properties jpaProperties = new Properties(); 
    jpaProperties.put(org.hibernate.cfg.Environment.DIALECT, env.getProperty(org.hibernate.cfg.Environment.DIALECT)); 
    jpaProperties.put(org.hibernate.cfg.Environment.SHOW_SQL, env.getProperty(org.hibernate.cfg.Environment.SHOW_SQL)); 
    jpaProperties.put(org.hibernate.cfg.Environment.HBM2DDL_IMPORT_FILES_SQL_EXTRACTOR, env.getProperty(org.hibernate.cfg.Environment.HBM2DDL_IMPORT_FILES_SQL_EXTRACTOR)); 
    entityManagerFactoryBean.setJpaProperties(jpaProperties); 

    entityManagerFactoryBean.afterPropertiesSet(); 

    return (EntityManagerFactory) entityManagerFactoryBean.getObject(); 
} 


@Override 
@Bean() 
@DependsOn("entityManagerFactoryBean") 
public PlatformTransactionManager annotationDrivenTransactionManager() { 
    JpaTransactionManager jpa = new JpaTransactionManager(); 
    jpa.setEntityManagerFactory(configureEntityManagerFactory()); 
    return jpa; 
} 
+0

Это, похоже, решило проблему. Не могли бы вы объяснить мне, что именно это произошло? – user856354

+0

Когда вы возвращаете 'LocalContainerEntityManagerFactoryBean' из' configureEntityManagerFactory', Spring-контейнер распознает, что он имеет «FactoryBean» и будет вызывать метод 'getObject()', чтобы создать экземпляр экземпляра 'EntityManagerFactory', поскольку он аннотируется с помощью' @ Bean'. Но когда вы вызываете этот 'configureEntityManagerFactory(). GetObject()' снова из метода annotationDrivenTransactionManager, вы снова создаете экземпляр 'EntityManagerFactory', который приводит к двум экземплярам, ​​из-за чего возникает проблема. – shazin

+1

Примечание: весной способ сделать это: 1) Изменить метод 'configureEntityManagerFactory' для возврата' FactoryBean ', удалить' .afterPropertiesSet() 'и' .getObject() 'и вернуть' entityManagerFactoryBean'. 2) Добавьте аргумент 'EntityManagerFactory entityManagerFactory' в метод' annotationDrivenTransactionManager' и используйте этот аргумент вместо вызова 'configureEntityManagerFactory()'. Вы также можете удалить аннотацию '@DependsOn (" entityManagerFactoryBean "), поскольку весна уже это знала. – Roman

Смежные вопросы