JAVA EE - EJB / CDI / JPA:异常处理

时间:2017-08-09 09:00:55

标签: java-ee exception-handling ejb

  

EJB容器以两种方式考虑异常 -

     
      
  • 应用程序异常 - 如果违反业务规则或在执行业务逻辑时发生异常。

  •   
  • 系统异常 - 任何异常,不是由业务逻辑或业务代码引起的。 RuntimeException,RemoteException是SystemException。例如,EJB查找期间出错。 RuntimeException,RemoteException是SystemException。

  •   

- >这是否意味着我需要为我的bussines逻辑使用已检查的异常?喜欢这个?

    private void checkConstraints(Object object) throws ValidationException{
    Set<ConstraintViolation<Object>> constraintsAdress = this.getValidator().validate(object);
    if(!constraintsAdress.isEmpty()){
        String fullErrorConstraint = "";
        for (ConstraintViolation<Object> constraint : constraintsAdress) {
            fullErrorConstraint = fullErrorConstraint + constraint.getMessage() + "\n";
        }
        throw new ValidationException(fullErrorConstraint);
    }
}

@Override
public long addCafe(Cafe cafe) throws ValidationException, DBException{
    this.checkConstraints(cafe.getAddress());
    for(FootballMatch footballMatch: cafe.getNextMatchesToWatch()){
        this.checkConstraints(footballMatch);
    }
    this.checkConstraints(cafe);
    this.getManager().persist(cafe);
    return cafe.getCafeID();
}

但......

  

应用程序异常不会自动导致将事务标记为回滚,除非将ApplicationException批注应用于异常类并使用rollback元素值指定true ...

我不再完全理解它了...... 使用是否是个好主意:

  • @ApplicationException(rollback = true)?
  • 然后你可以使用这个来制作未经检查的例外吗?
提前谢谢 干杯 汤姆

1 个答案:

答案 0 :(得分:2)

  • ImO @ApplicationException(rollback = true)是一个好主意,因为那时定义了容器的行为。一旦发生这种异常,回滚就是确定的。
  • 您还可以将未经检查的异常声明为ApplicationExceptions。

如果您有兴趣,我会使用以下测试来比较tomee和wildfly的行为: Baseclass-Bean for test

实际的测试类是:

arquillian/wildflytomee/embedded

某些测试已停用,因为tomee似乎没有正确支持“inherited”。