使用Spring注入EntityManager(空指针异常)

时间:2013-10-01 05:17:26

标签: spring entitymanager

这是我的ApplicationContext.xml

中的代码
    <context:spring-configured />
<context:annotation-config />
<context:component-scan base-package="com.apsas.jpa" />
<tx:annotation-driven />

<bean id="entityManagerFactory"
    class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
    <property name="persistenceUnitName" value="testjpa" />
</bean>

<bean id="entityManager"
    class="org.springframework.orm.jpa.support.SharedEntityManagerBean">
    <property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
    class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />

这是我的Dao实施

public class TeacherDaoImpl implements TeacherDao {

@Autowired
private EntityManager entityManager;

@Transactional
public Teacher addTeacher(Teacher teacher) {
    entityManager.persist(teacher);
    return teacher;

}

}

这是我的主要课程

public class TestApp {

public static void main(String[] args) {

    ApplicationContext applicationContext = new ClassPathXmlApplicationContext(
            "config/ApplicationContext.xml");       

    TeacherDao teacherDao = new TeacherDaoImpl();       
    Teacher teacher1 =  teacherDao.addTeacher(new Teacher("First Teacher"));

}

}

请帮助,我得到一个空指针异常

Exception in thread "main" java.lang.NullPointerException
at com.apsas.jpa.dao.impl.TeacherDaoImpl.addTeacher(TeacherDaoImpl.java:22)
at com.apsas.jpa.main.TestApp.main(TestApp.java:26)

我已经在2天内解决了这个问题,但仍然无法找到任何可以解决这个问题的资源。如果你能给我你的意见,答案或任何可以帮助我解决这个问题的想法,我将不胜感激,

ps:我是学习春天的新手

2 个答案:

答案 0 :(得分:4)

由于您在main中自己实例化TeacherDaoImpl(使用new关键字),因此Spring不会注入EntityManager,因此注入NPE。

使用TeacherDaoImpl.entityManager注释字段@PersistenceContext并使用TeacherDaoImpl注释@Component类,让Spring为您实例化它。然后在你的主要内容中,抓住那个bean:

TeacherDao dao = applicationContext.getBean(TeacherDao.class);
// ...

这两个指令似乎也是不必要的:

<context:annotation-config />
<context:spring-configured />

当您使用<context:component-scan />时隐含前者。后者仅在您的代码中使用@Configurable时才有用。

答案 1 :(得分:2)

您需要使用@PersistenceContext来注入EntityManager

PersistenceContext EntityManager injection NullPointerException

这几乎是同一个问题。