1

我有 3 个 EJB:

第一个是持久性:

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

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

第二个是商业:

@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);
            }
      }
}

第三个是调用业务 EJB 的 Web 服务。

问题是业务 EJB 没有捕获数据库异常,例如封装在 EJB 异常中的 Mysql 连接器抛出的约束冲突异常。我可以在 Rest 服务 EJB 上处理这个异常,但不能在业务 EJB 上处理。我认为这与交易有关。

我不确定应该将哪些事务属性添加到 Persistence EJB 和 Business EJB 以让我在业务 EJB 中捕获这些类型的异常。

4

1 回答 1

2

你是对的,显示的行为可能与事务边界有关。您的 Web 服务(我现在猜)是上层的非 EJB 层,因此当您调用BusinessService.register()事务时,事务在调用之前开始,并在此调用返回之前结束。

运行时异常发生在提交时,在您的情况下发生在register()方法代码结束后;因此,现在处理它们还为时过早。

如果您真的不想处理 Web 服务 bean 中的异常,您有两个选择:

一。BusinessService在bean中使用 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);
        }
  }
}

。在 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 回答