繁体   English   中英

使用EntityManager的persist()函数时的java.lang.NullPointerException(Spring 4 ORM)

[英]java.lang.NullPointerException when using EntityManager's persist() func (Spring 4 ORM)

我经历了许多与此类似的问题,但仍然陷入僵局。

我创建了模型,Dao和服务类。 我正在编写我的JUnit测试套件,但是当我尝试测试持久功能时,我得到了java.lang.NullPointerException。 我确实尝试在IDE中设置一些断点并进行调试,但令人困惑的是为什么会这样。

下面是我的模型,Dao和服务的代码以及spring.xml文件。

模型(为简洁起见,我避免使用构造函数和其他字段)

@Entity
public class Request implements Serializable {

    @Id
    private Integer restRequestId;

    private Timestamp restRequestTimestamp;

    private String restRequestParameters;
}

@Component
public class RequestDAO {

    @PersistenceContext
    private EntityManager entityManager;

    public void persist(Request request) {
        entityManager.persist(request);
    }

    public void update(Request request) {
        entityManager.getTransaction().begin();
        entityManager.merge(request);
        entityManager.getTransaction().commit();
    }

    public Object findById(Serializable id) {
        Request request = entityManager.find(Request.class, id);
        if (request == null) {
            throw new EntityNotFoundException("Cannot find Request for ID " + id);
        }
        return request;
    }

    public void delete(Request request) {
        entityManager.getTransaction().begin();
        entityManager.remove(request);
        entityManager.getTransaction().commit();
    }

    public void deleteById(Serializable id) {
        Request request = entityManager.find(Request.class, id);
        if (request == null) {
            throw new EntityNotFoundException("Cannot find Request for ID " + id);
        } else if (request != null) {
            entityManager.getTransaction().begin();
            entityManager.remove(request);
            entityManager.getTransaction().commit();
        }
    }

    public List<Request> findAll() {
        Query query = entityManager.createQuery("SELECT e from Request e");
        List<Request> requests = query.getResultList();
        return requests;
    }

    public void deleteAll() {
        List<Request> requests = findAll();
        for (Request request : requests) {
            delete(request);
        }
    }

}

RequestService

@Component
public class RequestService {

    @Autowired
    private RequestDAO requestDAO;

    @Transactional
    public void add(Request request) {
        requestDAO.persist(request);
    }

    @Transactional
    public void update(Request request) {
        requestDAO.update(request);
    }

    @Transactional
    public Object findById(Serializable id) {
        return requestDAO.findById(id);
    }

    @Transactional
    public void delete(Request request) {
        requestDAO.delete(request);
    }

    @Transactional
    public void deleteById(Request request) {
        requestDAO.delete(request);
    }

    @Transactional
    public void deleteAll() {
        requestDAO.deleteAll();
    }

    @Transactional
    public void addAll(Collection<Request> requestCollection) {
        for (Request request : requestCollection) {
            requestDAO.persist(request);
        }
    }

    @Transactional(readOnly = true)
    public List<Request> findAll() {
        return requestDAO.findAll();
    }
}

spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-4.2.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd">


    <context:component-scan base-package="com.company"/>
    <mvc:annotation-driven/>
    <context:annotation-config/>

    <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/>

    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="org.hsqldb.jdbcDriver"/>
        <property name="url" value="jdbc:hsqldb:mem://requestDb"/>
        <property name="username" value="user"/>
        <property name="password" value="pass"/>
    </bean>

    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
          p:packagesToScan="com.company"
          p:dataSource-ref="dataSource">
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                <property name="generateDdl" value="true"/>
                <property name="showSql" value="true"/>
            </bean>
        </property>
    </bean>

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

    <tx:annotation-driven transaction-manager="transactionManger"/>


</beans>

JUnit测试类

public class RequestServiceTest {

    @Autowired
    RequestDAO requestDAO;


    @Before
    public void setUp() throws Exception {
    }

    @After
    public void tearDown() throws Exception {

    }

    @Test
    public void add() throws Exception {
        RequestService requestService = new RequestService();
        Request requestObject = new Request();
        requestObject.setRestRequestId(1);
        requestObject.setRestRequestParameters("hello");
        requestService.add(requestObject);
        Request requestResponseFromDatabase = (Request) requestService.findById(1);
        assertEquals("hello", requestResponseFromDatabase.getRestRequestParameters());
    }
}

您的单元测试如何知道应该由Spring驱动? 为了在JUnit测试中使用Spring,您应该与Spring一起运行(使用@RunWith(SpringJUnit4ClassRunner.class)批注并提供一些其他配置)。

否则,JUnit甚至不会处理@Autowire

您可以在此处阅读更多内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM