![](/img/trans.png)
[英]java.lang.NullPointerException in EntityManager with spring mvc and hibernate
[英]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.