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 にどのトランザクション属性を追加する必要があるかわかりません。