2011-06-27 3 views
0

Je suis en train de mettre en œuvre Spring MVC 3 + EclipseLink JPA 2 Quand j'appelle saveUser par exemple, il retourne queentitymanager est nulle sur la classe DAO

NullPointerException, EntityManager est null

:

public class UserDAO { 
    @PersistenceContext 
    private EntityManager em; 
    public void setEntityManager(EntityManager em) { 
     this.em = em; 
    } 

    @Transactional 
    public User saveUser(User user){ 
     return em.merge(user); 
    } 

Ma config est:

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
    <property name="entityManagerFactory" ref="entityManagerFactory" /> 
    <property name="dataSource" ref="dataSource"></property>  
</bean> 

<bean id="entityManagerFactory" 
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="persistenceUnitName" value="application" /> 
    <property name="jpaVendorAdapter"> 
     <bean 
      class="org.springframework.orm.jpa.vendor.EclipseLinkJpaVendorAdapter"> 
      <property name="showSql" value="true" /> 
      <property name="databasePlatform" value="org.eclipse.persistence.platform.database.MySQLPlatform" /> 

      <property name="generateDdl" value="false" /> 
     </bean> 
    </property> 
    <property name="loadTimeWeaver"> 
     <bean 
      class="org.springframework.instrument.classloading.SimpleLoadTimeWeaver" /> 
    </property> 
</bean> 
<bean id="dataSource" 
    class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="username" value=".." /> 
    <property name="password" value=".." /> 
    <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
    <property name="url" 
     value="jdbc:mysql://..." /> 
</bean> 

ont également

<context:component-scan base-package="com.elasticbeanstalk.mypackage" /> 
<context:annotation-config /> 

Il n'initialise JPA lors du démarrage Tomcat. Pourquoi suis-je voir NPE? Pourrais-je manquer quelque chose?

+1

Pouvez-vous envoyer le code de la classe de service à l'endroit où votre DAO est utilisé? – gouki

+0

non Je n'ai pas de classe de service. Juste essayé du contrôleur le userDAO userDAO suivant = new UserDAO(); Utilisateur utilisateur = nouvel utilisateur(); user.setName ("nom"); userDAO.save (utilisateur); Dois-je mettre quelque chose au milieu? – chro

Répondre

5

Si vous instanciez le UserDAO manuellement, rien ne sera injecté par Spring. Si le DAO se trouve dans un paquet qui est sous votre base-package de <context:component-scan ../> alors vous pouvez simplement l'autowire dans votre contrôleur. Si ce n'est pas le cas, modifiez le paquet de base ou vous pouvez également définir manuellement le DAO dans le contexte d'application, puis vous pouvez aussi procéder automatiquement.

+0

il ne s'autowire pas bien sans interface, donc j'ai créé l'interface, et il semble bon. – chro

Questions connexes