1

3 つの EJB があります。

最初のものは持続性のためのものです:

@Stateless
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public class PersistenceService
{
    @PersistenceContext(unitName="pc")
    EntityManager em;

    public <T> void create(T entity) {
        em.persist(entity);
    }
}

2 つ目はビジネス用です。

@Stateless
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public class BusinessService implements 
{
    @EJB
    PersistenceService persistenceService;

    public <T> void register (User user) {
            try{
                    // Do some business
                    persistenceService.persist(user);
                    // Do other business
            }catch(Exception e){
                    // log exception
                    throw new BusinessException(e);
            }
      }
}

3 つ目は、ビジネス EJB を呼び出す Web サービスです。

問題は、EJB 例外にカプセル化された Mysql コネクタによってスローされる制約違反例外などのデータベース例外をビジネス EJB がキャッチしないことです。Rest サービス EJB ではこの例外を処理できますが、ビジネス EJB では処理できません。私はそれがトランザクションに関連していると思います。

ビジネス EJB でこれらのタイプの例外をキャッチできるようにするには、永続 EJB とビジネス EJB にどのトランザクション属性を追加する必要があるかわかりません。

4

1 に答える 1

2

そうです、表示された動作はトランザクション境界に関連している可能性があります。あなたのWebサービス(私は今推測しています)は上位の非EJBレイヤーであるためBusinessService.register()、トランザクションを呼び出すと、呼び出しの直前に開始され、この呼び出しが戻る直前に終了します。

register()実行時例外はコミット時に発生します。この場合、メソッドのコードが終了した直後に発生します。したがって、そこでそれらを処理するには時期尚早です。

Web サービス Bean で例外を処理したくない場合は、次の 2 つのオプションがあります。

1。BusinessServiceBean でのBean管理トランザクションの使用

@Stateless
@TransactionManagement(TransactionManagementType.BEAN)
public class BusinessService 
{
@EJB
PersistenceService persistenceService;
@Resource
private UserTransaction ut;

public <T> void register (User user) {
        try{
                ut.begin();
                // Do some business
                persistenceService.persist(user);
                // Do other business
                ut.commit();
        }catch(Exception e){
                // log exception
                throw new BusinessException(e);
        }
  }
}

2つ。Web サービス Bean と EJB 間の非トランザクション ファサードの導入:

@Stateless
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public FacadeBean {

    @EJB private BusinessService businessService;

    public void facadeMethod(User user) {
        try {
            businessService.register(user);
        } 
        // your handling code here
        catch (...) { ... }
    }

}
于 2013-04-23T08:20:33.423 に答える