我正在研究具有以下结构的项目:
DaoService - 是Spring bean,它具有SessionFactory对象,并使用Hibernate对数据库执行数据库操作。标有@Repository
几个BLogicService服务 - 是具有DaoService Autowired的Spring bean,它在POJO上执行一些操作并在Hibernate中持久化。标有@Service
注释。
JSF 2.1 Managed Beans - 使用XHTML页面进行迭代并保存属性和JSF操作。标记为@ManagedBean
并从Spring接收BlLogicServices对象@ManagedProperty
最后访问托管bean的XHTML页面。
在此类应用程序中管理异常处理的正确方法是什么?如果我在DAO级别上有异常,那么将它转发到GUI的正确方法是什么?
如果我使用的是Spring MVC,我会使用`@ExceptionHandler,但是如何在Spring的JSF 2.1中完成?
答案 0 :(得分:1)
要在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()来更新视图,因为未处理的异常会中止JSF生命周期。
或者,您可以在所有托管bean方法中使用try / catch,并在那里执行myProcessing(t)的等效项。区别在于ExceptionHandler还会在页面呈现期间捕获异常,而不一定是由类生成的。
答案 1 :(得分:0)
不应将异常传递给用户界面。
您使用Web MVC层的事实表明您已经拥有某种接受,验证和绑定传入请求的控制器;选择一个处理程序来完成请求;包装反应,无论好坏;并选择下一个视图。该异常需要返回到该控制器,然后该控制器将生成必要的信息并选择错误视图。
你的其余问题只是混淆了这个问题。 DAO,MDB等 - 都需要由某种处理程序编组。 (JSF是否仍然调用那些Actions?我从不使用它。)该处理程序应该捕获任何异常并通过控制器将它们传回UI。