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

标签 java hibernate spring jsf jakarta-ee

我正在从事具有以下结构的项目:

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/

相关文章:

java - 接口(interface)和抽象(或 super )类方法之间的偏好

java - QueryDSL 4 与 RowNumber Window 功能

java - 如何使用 Hibernate 框架和 MySql 数据库提高 Web 应用程序的搜索性能

java - SQL Server 标识已开启,但 org.hibernate.id.IdentifierGenerationException : ids for this class must be manually assigned beforeQuery calling save()

java - 使用 Hazelcast 而不是 MongoDB 存储用户 session / key 有什么好处?

java - 在 JSTL 中使用 varStatus 时,如何访问 list<class> 的字段?

java - JPA OneToMany 和 ManyToOne 之间的关系

Java Ribbon - Activity 项目 - 火烈鸟的替代品

java - 如何从 Mono<Boolean> 类型字段中提取值?

java - Spring Boot中Spring Security的XML配置