gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 19:37:57 26 4
gpt4 key购买 nike

我维护一个 Web 应用程序,该应用程序的页面带有 JSF 标签 <f:event 。我重写了服务类中的一个方法,让它抛出业务异常。但是,当抛出业务异常时,它不会被托管 bean 捕获,并且异常会显示在页面上。看来我的代码 try/catch不起作用。

在 XHTML 中:

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

托管 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 的处理程序类。但哪个以及如何?

<小时/>

已编辑

OBS 1:BusinessException类(class)扩展RuntimeException类。

OBS 2:属性 canCreateResource创建是为了控制按钮的呈现。

最佳答案

这是因为你抛出了 RuntimeException来自 EJB。

当这样的RuntimeException没有用@ApplicationException注释时,然后 EJB 容器会将其包装在 javax.ejb.EJBException 中并重新抛出它。这样做是因为运行时异常通常仅用于指示代码逻辑中的错误,即程序员的错误而不是最终用户的错误。您知道,NullPointerExceptionIllegalArgumentExceptionIndexOutOfBoundsExceptionNumberFormatException 等等。这允许 EJB 客户端对此类运行时异常有一个捕获所有点,例如 catch (EJBException e) { 服务层或我们使用它的方式存在错误! }

如果您尝试过catch (Exception e)并检查了实际的异常,那么您就会注意到这一点。

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

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

请注意,如果抛出非RuntimeException,那么您仍然需要保留注释,显式使用rollback=true,因为默认情况下它不会执行回滚,与没有注释的 RuntimeException 相反。

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

总结:

  1. 从事务性 EJB 方法抛出的 RuntimeException 将执行完全回滚,但异常将包装在 EJBException 中。
  2. 仅当显式设置 rollback=true 时,来自事务 EJB 方法的 RuntimeException@ApplicationException 才会执行完全回滚。事务性 EJB 方法中的
  3. 异常将不会执行完全回滚。
  4. 仅当显式设置 rollback=true 时,事务 EJB 方法中带有 @ApplicationException
  5. Exception 才会执行完全回滚。

请注意,@ApplicationException 继承自自定义异常的所有子类,因此您无需对所有子类重复它。最好的办法是将其作为抽象类。另请参阅下面链接的相关问题中的示例。

另请参阅:

关于jsf - Java EE前端方法中处理服务层异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32853167/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com