2016-08-23 9 views
0

私は非同期Webサービスメソッドを持っていますが、私は応答202(Accepted)を送り、DBと同じ変更を行いたいと思います。 JPAでどのように実装できますか?JPAを使用した非同期Webサービス

@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

クラスIで設定した注釈を忘れた@Transactional – Vas9IH

+0

質問を編集できます。 – talex

+0

ありがとう、私は気づかなかった – Vas9IH

答えて

0

すべての実際のコードをrunから別のクラスに移動し、方法をTransactionalアノテーションに移動する必要があります。 Springはランタイムマジックを強制的に実行します。

このserviseクラスをあなたに注入して呼び出します。

PS:名前のないクラスの新しいメソッドへのコードの移動は役に立ちません。

+0

私は試みたが、それは問題を解決しなかった – Vas9IH

+0

申し訳ありません。私は「春」がどのように魔法をするのか忘れていました。 – talex

0

一般に、JEEアプリケーションでスレッドを作成することは推奨されません。それを正しく行うにはJava EE specification and multi threadingを参照してください。

独自のスレッドを作成したい場合は、Beanを自分で作成するのではなく、ApplicationContext.getBean()を使用してSpringを作成するようにしてください。それで春はそれを魔法にすることができます。 (また、これもお勧めしません。こちらをご覧ください。Why is Spring's ApplicationContext.getBean considered bad?

関連する問題