我正在从事具有以下结构的项目:
DaoService - 是具有 SessionFactory 对象并使用 Hibernate 对数据库执行数据库操作的 Spring bean。标有@Repository
几个 BLogicService 服务 - 是具有 DaoService Autowired 并在 POJO 上执行一些操作并将其持久保存在 Hibernate 中的 Spring bean。用@Service
注解标记。
JSF 2.1 Managed Beans - 迭代 XHTML 页面并保存属性和 JSF 操作。标记为 @ManagedBean
并从 Spring 接收 BlLogicServices 对象作为 @ManagedProperty
最后是访问托管 bean 的 XHTML 页面。
在此类应用程序中管理异常处理的正确方法是什么?如果我在 DAO 级别有异常,将它转发到 GUI 的正确方法是什么?
如果我使用 Spring MVC,我会使用 `@ExceptionHandler,但是如何在 JSF 2.1 中使用 Spring 来完成呢?
最佳答案
要在 BL 处理期间为所有意外异常创建通用异常捕获器,您可以实现 ExceptionHandlerFactory 并在 faces-config.xml 中指定它:
<factory>
<exception-handler-factory>
my.package.ExceptionHandlerFactory
</exception-handler-factory>
</factory>
它应该创建 ExceptionHandler 实现,该实现又实现 handle 方法,例如一个消费异常(我想我已经从 JSF2 引用或类似源中获取它):
private static class MyExceptionHandler extends ExceptionHandlerWrapper {
private ExceptionHandler parent;
public WfExceptionHandler(ExceptionHandler parent) {
this.parent = parent;
}
@Override
public ExceptionHandler getWrapped() {
return this.parent;
}
@Override
public void handle() throws FacesException {
for (Iterator<ExceptionQueuedEvent> i =
getUnhandledExceptionQueuedEvents().iterator();
i.hasNext();) {
ExceptionQueuedEvent event = i.next();
i.remove();
ExceptionQueuedEventContext context =
(ExceptionQueuedEventContext) event.getSource();
Throwable t = context.getException();
myProcessing(t);
}
}
...
}
myProcessing(t) 可以检索托管 bean,它将向您的 gui 控制台打印异常,或者您可以只使用 FacesContext.getCurrentInstance().addMessage()。您还需要调用 FacesContext.getCurrentInstance().renderResponse() 来更新 View ,因为未处理的异常中止了 JSF 生命周期。
或者,您可以在所有托管 beans 方法中使用 try/catch 并在那里执行等效的 myProcessing(t)。不同之处在于 ExceptionHandler 还会在页面呈现期间捕获异常,不一定由您的类生成。
关于java - JSF 2.1 + Spring + hibernate 如何正确实现异常处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6745159/