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