2011-06-27 28 views
0

我試圖實現Spring MVC 3 + EclipseLink的JPA 2 當我打電話saveUser例如它返回EntityManager的是DAO類空

NullPointerException異常的,但EntityManager是 空

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); 
    } 

我的配置是:

<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> 

也有

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

Tomcat啓動時它初始化JPA。爲什麼我會看到NPE?我能錯過什麼嗎?

+1

您可以將服務類的代碼發佈到您的DAO正在使用的位置嗎? – gouki

+0

不,我沒有任何服務級別。剛剛從Controller中試過以下UserDAO userDAO = new UserDAO();用戶用戶=新用戶(); user.setName( 「名稱」); userDAO.save(用戶);我必須把東西放在中間嗎? – chro

回答

5

如果您手動實例化UserDAO,Spring將不會注入任何東西。如果DAO位於base-package<context:component-scan ../>中,那麼您可以將其自動裝入您的控制器。如果沒有,則可以修改基本包或者也可以手動在appcontext中定義DAO,然後也可以自動裝配。

+0

它沒有自動裝配,沒有界面,所以我創建了界面,它看起來不錯。 – chro