2016-08-23 230 views
0

我有異步的Web服務方法,我想發送responce 202(接受),並做與數據庫相同的更改。我如何使用JPA實現它? 這裏我服務的方法:異步的Web服務JPA

@Transactional 
public void createTask(@Suspended AsyncResponse response){ 
    new Thread(){ 
     public void run(){ 
      RequestTask requestTask = new RequestTask(); 
      requestTask.setAim("all tables"); 
      requestTask.setDescription("Update Tables"); 
      requestTask.setOwner("John Calagan"); 

      requestTaskDao.createRequestTask(requestTask); 
     } 

    }.start(); 

    Response acceptedResponse = Response.status(Response.Status.ACCEPTED).build(); 
    response.resume(acceptedResponse); 
} 

吾道級別:

@PersistenceContext(unitName = "administration") 
private EntityManager entityManager; 

@Override 
public void createRequestTask(RequestTask requestTask) { 
    entityManager.persist(requestTask); 
} 

但我有一個例外:

Exception in thread "Thread-6" javax.persistence.TransactionRequiredException: No EntityManager with actual transaction available for current thread - cannot reliably process 'persist' call at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityMa nagerInvocationHandler.invoke(SharedEntityManagerCreator.java:282) at com.sun.proxy.$Proxy33.persist(Unknown Source) at... 

我怎樣才能解決這個問題呢?

+0

忘了說我在課堂上註釋@Transactional – Vas9IH

+0

你可以編輯你的問題。 – talex

+0

謝謝,我沒有注意到 – Vas9IH

回答

0

您應該將run中的所有實際代碼移動到Transactional註釋中,將類和標記方法分開。它迫使Spring做它的運行時魔術。

然後注入這個servise類到你的並稱之爲。 PS:將代碼移動到未命名類的新方法將無濟於事。

+0

我試過了,但是沒有解決問題 – Vas9IH

+0

對不起。我忘了'春天'如何神奇。 – talex