2016-05-20 6 views
1

私はこれに似た数多くの質問を行ってきましたが、今でも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()); 
    } 
} 

答えて

2

どのようにあなたのユニットテストは、それがスプリングによって駆動する必要があります知っているのですか? JUnitテストでSpringを使用するには、Springで実行する必要があります(@RunWith(SpringJUnit4ClassRunner.class)注釈を使用し、いくつかの追加設定を行います)。

そうでない場合は、JUnitのもあなたがこのhere

希望の詳細を読むことができます@Autowire

を処理しません。この

+0

が、私はそれを忘れてしまったと考えていることができないのに役立ちます。それで私の問題は解決しました。ありがとうございました。追加情報をありがとうございました! – abhi

関連する問題