2017-03-01 14 views
-2

私はSpringベースのアプリケーションを持っており、Hibernateを動作させる必要があります。 A Guide to Hibernate with Spring 4と私は、Javaクラスを作成した(私はHibernateのXMLレスを設定する)::だから私は、このチュートリアルに触発されてしまったJPAコンフィグレーションでSpring Beanを作成する際のヌルポインタ例外

package com.mycompany.cmms.web.config; 



import java.util.Properties; 

import javax.persistence.EntityManagerFactory; 
import javax.sql.DataSource; 

import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor; 
import org.springframework.jdbc.datasource.DriverManagerDataSource; 
import org.springframework.orm.jpa.JpaTransactionManager; 
import org.springframework.orm.jpa.JpaVendorAdapter; 
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; 
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; 
import org.springframework.transaction.PlatformTransactionManager; 
import org.springframework.transaction.annotation.EnableTransactionManagement; 

@Configuration 
@EnableTransactionManagement 
public class PersistanceJPAConfig { 


    @Bean 
    public EntityManagerFactory entityManagerFactory() { 
     LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); 
     em.setDataSource(dataSource()); 
     em.setPackagesToScan(new String[] { "com.vsb.cmms.domain" }); 

     JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); 
     em.setJpaVendorAdapter(vendorAdapter); 
     em.setJpaProperties(additionalProperties()); 

     return em.getObject(); 
    } 

    @Bean 
    public DataSource dataSource(){ 
     DriverManagerDataSource dataSource = new DriverManagerDataSource(); 
     dataSource.setDriverClassName("org.postgresql.Driver"); 
     dataSource.setUrl("jdbc:postgresql://localhost:5432/cmms"); 
     dataSource.setUsername("postgres"); 
     dataSource.setPassword("xxx"); 
     return dataSource; 
    } 



    @Bean 
    public PlatformTransactionManager transactionManager(EntityManagerFactory emf){ 
     JpaTransactionManager transactionManager = new JpaTransactionManager(); 
     transactionManager.setEntityManagerFactory(emf); 

     return transactionManager; 
    } 

    @Bean 
    public PersistenceExceptionTranslationPostProcessor exceptionTranslation(){ 
     return new PersistenceExceptionTranslationPostProcessor(); 
    } 

    Properties additionalProperties() { 
     Properties properties = new Properties(); 
     properties.setProperty("hibernate.hbm2ddl.auto", "create-drop"); 
     properties.setProperty("hibernate.dialect", "org.hibernate.dialect.PostgreSQLDialect"); 
     properties.setProperty("hibernate.query.factory_class", "org.hibernate.hql.internal.classic.ClassicQueryTranslatorFactory"); 
     return properties; 
    } 
} 

をしかし、私は構築し、自分のアプリケーションを起動したときに私はこのエラーを取得:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'transactionManager' defined in com.vsb.cmms.web.config.PersistanceJPAConfig: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: 'entityManagerFactory' or 'persistenceUnitName' is required 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1583) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.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.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:751) 
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:861) 
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:541) 
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:4717) 
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5179) 
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) 
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1404) 
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1394) 
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: java.lang.IllegalArgumentException: 'entityManagerFactory' or 'persistenceUnitName' is required 
at org.springframework.orm.jpa.JpaTransactionManager.afterPropertiesSet(JpaTransactionManager.java:304) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1642) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1579) 
... 21 more 

'entityManagerFactory 'または' persistenceUnitName 'が必要であるというエラーが表示されます。しかし、entityManagerFactory()を介してエンティティマネージャファクトリを提供する必要があります。 私はこのbeanをデバブしたとき、私はem.getObject()がnullを返すことに気がつきましたが、なぜこのようなことが起こっているのかわかりませんが、エラーを引き起こしている可能性があります。私はSpring 4とHibernate 5.2.3を使用しています。

+2

"entityManagerFactory"または "persistenceUnitName"が必須である限り、このコードは完全に動作します。それではっきりしないものは何ですか?そしてNullPointerExceptionはどこにありますか? – Tunaki

+0

私は気づいたが、このエラーはnullを返すため、entityManagerFactory()によって発生しています。私の質問は:理由とその修正方法です。 –

+0

@Entityでアノテートされたクラスがこのパッケージcom.vsb.cmms.domain – pkoli

答えて

0

あなたentityManagerFactory()方法は本当に#getObject()を呼び出すべきではありませんが、その代わりとして、あなたはそれを書く必要があります。春には工場出荷時のBeanが自動的にあなたのEntityManagerFactoryインスタンスを与えることを扱う

@Bean 
public LocalContainerEntityManagerFactoryBean entityManagerFactory() { 
    LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); 
    em.setDataSource(dataSource()); 
    em.setPackagesToScan(new String[] { "com.vsb.cmms.domain" }); 

    JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); 
    em.setJpaVendorAdapter(vendorAdapter); 
    em.setJpaProperties(additionalProperties()); 

    // just return the bean here 
    return em; 
} 

。あなたがしたい場合は、単にインターネットのディープスで見つかっ

+0

に存在するかどうかを確認できますか?私が変更した場合、エラーは消えますが、EntityManagerまたはEntityManagerFacotryはDAOクラスではnullです。 –

+0

あなたは '@ PersistenceContext'を使ってそれを注入していますか? – Naros

0

は... は、XMLは、少ないし、あなたはおそらくthis

を見たいと思って、(トランザクションのアプリケーションやセッションのセッション)のセッションを制御しやすい機会とコンフィギュレーションを休止します

Hibernate 5.2バージョン

関連する問題