私はこれに似た数多くの質問を行ってきましたが、今でも1日以上にわたって行き詰まっています。EntityManagerのpersist()func(Spring 4 ORM)を使用している場合のjava.lang.NullPointerException
モデル、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());
}
}
が、私はそれを忘れてしまったと考えていることができないのに役立ちます。それで私の問題は解決しました。ありがとうございました。追加情報をありがとうございました! – abhi