JSF 2.1 + Spring + hibernate如何正确实现异常处理?

时间:2011-07-19 09:41:01

标签: java hibernate spring jsf java-ee

我正在研究具有以下结构的项目:

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中完成?

2 个答案:

答案 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。