春季异常处理

时间:2014-10-18 03:20:01

标签: spring hibernate exception-handling transactional

我正在使用spring + hibernate开发web应用程序。据我所知,最好将@transactional放在服务层中。在将数据更新到数据库时,如果出现任何异常,Spring会抛出DataAccessException。

以下是我的高级班级结构。

@Transactional
class OrderService {
    public void createOrder() {
        try {
           orderDAO.createOrder();
        } catch (DataAccessException e) {
            // convert into business exception and sends back to presentation logic.
        }
    }

}

这里发生的是仅在方法完成后抛出数据访问异常。因此,如果发生任何异常,我无法将其转换为catch块中的业务异常。

解决方法是在dao方法中刷新hibernate会话,但我不喜欢这种方法。有没有更好的方法呢?

1 个答案:

答案 0 :(得分:1)

我认为您使用的是Spring MVC,尽管您没有指定。如果您使用的是Spring MVC,那么有几个不同的选项。

  1. 您可以创建一个查找DAE异常的过滤器,并将其重新编码为您的前端更好理解的不同状态或异常。您可以查看Spring Security的ExceptionTranslationFilter作为如何针对不同异常执行此操作的示例
  2. 您可以使用SimpleMappingExceptionResolver将特定例外映射到特定视图。这将允许您的表示层不可知,并且不需要了解抛出的异常。
  3. 您可以使用特定控制器中的@ExceptionHandler以一般方式处理DAE异常,并为表示层准备适当的内容。
  4. 作为#3的扩展,您可以使用@ControllerAdvice来管理webapp中任何控制器的所有DAE例外。
  5. 您也可以阅读Exception Handling in Spring MVC了解更多详情。

    一般来说,我发现最好的解决方案是在更高级别捕获事务异常并操纵信息以后端不可知的方式将其呈现给前端。这允许您设置自己的错误代码/等。我在服务中尝试/捕获异常的唯一一次是,如果我真的想尝试重试或根据某些特定异常修改逻辑流程,并且不希望前端知道它。