rog*_*til 3 jsf ejb exception-handling java-ee service-layer
我维护一个Web应用程序,其中包含一个带有JSF标记的页面<f:event.我在服务类中重写了一个方法,以便抛出一个业务异常.但是,当抛出业务异常时,它不会被托管bean捕获,并且页面上会显示异常.似乎我的代码try/catch不起作用.
在XHTML中:
<f:event listener="#{resourceBean.init(enrollment)}" type="preRenderView" />
Run Code Online (Sandbox Code Playgroud)
Managed Bean中的监听器方法:
private boolean canCreateResource;
public void init(Enrollment enrollment) {
(...)
try {
canCreateResource = resourceService.canCreateResource(enrollment);
} catch (BusinessException e) {
canCreateResource = false;
}
}
Run Code Online (Sandbox Code Playgroud)
服务类中的方法:
public boolean canCreateResource(Enrollment enrollment) {
if (...) {
if (mandateService.isCoordinator(user, course)) {
return true;
} else {
throw new BusinessException("Undefined business rule.");
}
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
从我在其他网站上看到的内容,我想我必须实现一些JSF的处理程序类.但是哪个以及如何?
EDITED
OBS 1:BusinessException该类扩展了RuntimeException类.
OBS 2:canCreateResource创建属性以控制按钮的渲染.
Bal*_*usC 11
这是因为你RuntimeException从EJB中抛出了一个.
如果RuntimeException未对其进行注释@ApplicationException,则EJB容器将其包装javax.ejb.EJBException并重新抛出.这样做是因为运行时异常通常仅用于指示代码逻辑中的错误,即程序员的错误而不是最终用户的错误.你知道,NullPointerException,IllegalArgumentException,IndexOutOfBoundsException,NumberFormatException和朋友.这允许EJB客户端为此类运行时异常提供一个全能点,例如catch (EJBException e) { There's a bug in the service layer or in the way how we are using it! }
如果您已经尝试catch (Exception e)并检查了实际的异常,那么您已经注意到了.
相应地修改您的BusinessException类以添加该注释,然后它将被识别为真正的应用程序异常,而不是包含在EJBException:
@ApplicationException(rollback=true)
public class BusinessException extends RuntimeException {
// ...
}
Run Code Online (Sandbox Code Playgroud)
请注意,如果你抛出一个non RuntimeException,那么你仍然需要保持注释,显式地使用rollback=true,因为默认情况下它不会执行回滚,相反RuntimeException没有注释.
@ApplicationException(rollback=true)
public class BusinessException extends Exception {
// ...
}
Run Code Online (Sandbox Code Playgroud)
总结如下:
RuntimeException从事务EJB方法抛出将执行完全回滚,但异常将被包装EJBException.RuntimeException使用@ApplicationException事务EJB方法只会在rollback=true显式设置时执行完全回滚.Exception 来自事务EJB方法将不会执行完全回滚.Exception使用@ApplicationException事务EJB方法只会在rollback=true显式设置时执行完全回滚.请注意,它@ApplicationException是在自定义异常的所有子类上继承的,因此您无需在所有子类上重复它.最好将它作为一个抽象类.另请参阅下面链接的相关问题中的示例.