Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
spring中的异常处理_Spring_Hibernate_Exception Handling_Transactional - Fatal编程技术网

spring中的异常处理

spring中的异常处理,spring,hibernate,exception-handling,transactional,Spring,Hibernate,Exception Handling,Transactional,我正在用spring+hibernate开发web应用程序。据我所知,将@transactional放在服务层是最佳实践。Spring在将数据更新到数据库时,如果出现异常,将抛出DataAccessException 下面是我的高级课程结构 @Transactional class OrderService { public void createOrder() { try { orderDAO.createOrder(); } ca

我正在用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会话,但我不喜欢这种方法。有更好的方法吗?

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

  • 您可以创建一个筛选器来查找DAE异常,并将其重新编码为前端能够更好地理解的不同状态或异常。您可以将SpringSecurity作为一个示例,说明如何针对不同的异常执行此操作
  • 可以使用将特定异常映射到特定视图。这将允许您的表示层是不可知的,并且不需要知道关于抛出的异常的任何信息
  • 您可以在特定控制器中使用,以一般方式处理DAE异常,并为表示层适当地准备一些内容
  • 作为#3的扩展,您可以使用管理webapp中任何控制器的所有DAE异常
  • 您也可以阅读更多详细信息


    一般来说,我发现最好的解决方案是在更高的级别捕获事务异常,并操纵信息,以后端不可知的方式将其呈现给前端。这允许您设置自己的错误代码等。我在服务本身中尝试/捕获异常的唯一时间是,如果我真的想尝试重试或根据某个特定异常修改逻辑流,并且不想让前端知道它,那么我可以使用AOP拦截器,但为什么?DataAccessException有什么问题?Spring已经提供了一个异常层次结构,将您与持久性框架特定的异常类型隔离开来。为什么你还想在这上面再加一个异常层次结构呢?我想向用户提供自定义消息。不是春天给的。除了AOP抛出建议,您还有其他选择吗?那么,为什么不在UI层捕获DataException呢?显示错误消息不是服务层的工作。我的表示层不应该知道数据库和其他事情。因此,我的设计在表示层中没有这样的逻辑。我的观点是服务层应该做所有的工作。