3

EJB内ではなく、JSFマネージドBean内でトランザクションをロールバックしたいと思います。EJB内では使用できますSessionContext.setRollBackOnly()が、マネージドBeanで何を使用できますか?

@Stateless
@Local(AccountLocal.class)
public class AccountBean implements AccountLocal {

   public void test1() throws CustomException(){
      ...
   } 

   public void test2() throws CustomException(){
      ...
      throw new CustomException();
   }   

   public void test3() throws CustomException(){
      ...
   }

   public void all() throws CustomException(){
       test1();
       test2();
       test3();
   } 

}

私のマネージドBeanでは:

@SessionScoped
public class LoginBean implements Serializable{

   public void test(){

      try{
         accountBean.test1();
         accountBean.test2();
         accountBean.test3();
      }catch(CustomException e){
         // WHAT HERE TO ROLLBACK TRANSACTION ?
      }      
    }    
}

編集:test1のいずれか、test2またはtest3ロールバックした場合、他の人もロールバックすることをどのように確認できますか?

このコードをテストし、ロールバックaccountBean.test1(); しても検証されました。accountBean.test2();

解決策は、この3つのメソッドを1つのEJBメソッド内にネストすることだけでしょうか?

 @SessionScoped
public class LoginBean implements Serializable{

   public void test(){

      try{
         accountBean.all();
      }catch(CustomException e){
        ...
      }      
    }    
}
4

2 に答える 2

5

チェックされていない例外がスローされた場合、トランザクションはEJBコンテナによって自動的にロールバックされます(JPAPersistenceExceptionはそのようなものであることに注意してください)。あなたCustomExceptionはチェックされた例外のようです。RuntimeException次のように拡張するように変更する場合

public class CustomException extends RuntimeException {
    // ...
}

または、新しいアノテーションを作成することはできません。その場合は、属性をに設定し@ApplicationExceptionてクラスにアノテーションを設定する必要があります。rollbacktrue

例えば

@ApplicationException(rollback=true)
public class CustomException extends Exception {
    // ...
}

具体的な問題はJSFとは関係がないことに注意してください。サービス層とトランザクションの管理は JSFの責任の範囲外です。代わりに、EJBの責任です。JSFは、この観点では単に「ビュー」として機能する必要があります。

参照:

于 2012-12-23T16:46:55.807 に答える
1

私はここで悪魔の擁護者を演じています。なぜなら、バッキングビーンをサービスとして機能させてはならないというBalusCのアドバイスは絶対に真実だからです。

ただし、純粋に技術的な演習として、バッキングBeanでJTAトランザクションを開始し、プログラムで開始とコミットまたはロールバックを制御することは可能です。

これを行うには、@Resourceを介してUserTransactionを挿入します。EJBメソッドを呼び出す前に、このインスタンスでstartを呼び出し、最後の呼び出しの後にcommitまたはrollbackを呼び出します。

繰り返しますが、これは純粋に理論的な答えです。実際には、これを行わず、必要に応じてバッキングBeanが他のEJBBeanを呼び出す1つのEJBメソッドを呼び出せるようにします。

于 2012-12-25T10:18:53.037 に答える