jsf – 在Java EE前端方法中处理服务层异常

我维护一个Web应用程序,其中包含一个带有JSF标记< f:event的页面.我在服务类中重写了一个方法,以便抛出一个业务异常.但是,当抛出业务异常时,它不会被托管bean捕获,并且页面上会显示异常.似乎我的代码try / catch不起作用. 在XHTML中:

<f:event listener="#{resourceBean.init(enrollment)}" type="preRenderView" />

Managed Bean中的监听器方法:

private boolean canCreateResource;

public void init(Enrollment enrollment) {
    (...)

    try {
        canCreateResource = resourceService.canCreateResource(enrollment);
    } catch (BusinessException e) {
        canCreateResource = false;
    }
}

服务类中的方法:

public boolean canCreateResource(Enrollment enrollment) {
    if (...) {
        if (mandateService.isCoordinator(user, course)) {
            return true;
        } else {
            throw new BusinessException("Undefined business rule.");
        }
    }

    return false;
}

从我在其他网站上看到的内容,我想我必须实现一些JSF的处理程序类.但是哪个以及如何?

EDITED

OBS 1:BusinessException类扩展了RuntimeException类.

OBS 2:创建了属性canCreateResource来控制按钮的渲染.

最佳答案
这是因为你从EJB中抛出了一个RuntimeException.

当这样的RuntimeException没有用@ApplicationException注释时,EJB容器将它包装在javax.ejb.EJBException中并重新抛出它.这样做是因为运行时异常通常仅用于指示代码逻辑中的错误,即程序员的错误而不是最终用户的错误.你知道,NullPointerException,IllegalArgumentException,IndexOutOfBoundsException,NumberFormatException和friends.这允许EJB客户端为这样的运行时异常提供一个全能点,例如catch(EJBException e){服务层中存在错误或者我们使用它的方式! }

如果您尝试过捕获(异常e)并检查实际异常,那么您已经注意到了.

相应地修复您的BusinessException类以添加该注释,然后它将被识别为真正的应用程序异常,而不是包装在EJBException中:

@ApplicationException(rollback=true)
public class BusinessException extends RuntimeException {
    // ...
}

请注意,如果抛出非RuntimeException,则仍需要使用rollback = true显式地保留注释,因为默认情况下它不执行回滚,而不是没有注释的RuntimeException.

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

总结如下:

>从事务EJB方法抛出的RuntimeException将执行完全回滚,但异常将包装在EJBException中.
>事务EJB方法中带有@ApplicationException的RuntimeException仅在显式设置rollback = true时执行完全回滚.
>事务EJB方法的异常将不执行完全回滚.
>事务EJB方法中的@ApplicationException异常仅在显式设置rollback = true时执行完全回滚.

请注意,@ applicationException是在自定义异常的所有子类上继承的,因此您无需在所有子类上重复它.最好将它作为一个抽象类.另请参阅下面链接的相关问题中的示例.

也可以看看:

> Letting the presentation layer (JSF) handle business exceptions from service layer (EJB)

转载注明原文:jsf – 在Java EE前端方法中处理服务层异常 - 代码日志