处理来自 dao 的预期异常

Handling expected exceptions from dao

我目前正在编写一个具有三层(控制器 -> 服务 -> dao)的 spring-mvc (jsp) 项目,我想知道处理预期异常的正确方法是什么从 dao 调用(例如,尝试保留一个已经存在的用户,如果它存在,则再次调用注册视图并显示一条消息说该用户已经存在),起初我认为捕获异常是个好主意dao(例如DataIntegrityViolationException)并抛出我的任意检查异常,这样我就可以在控制器中为它做一个异常处理程序,但我担心如果我这样做,那么如果我想稍后制作我的服务方法@Transactional,我可能会发生冲突,因为spring 不知道如何回滚事务。

如果这是正确的,那么我有两个想法:

  1. try/catch 当我调用服务调用时控制器中的 DataAccessException userService.register(..)

  2. 在控制器中使用 userService.findByUsername(username) 之类的内容(returns 是可选的),如果它存在,我会在调用 [= 之前​​通知用户27=](..)

此外,我们的老师强调遵循 DDD 行为并试图避免在我们的控制器中泄漏业务逻辑,我担心这两种解决方案都会这样做,但我真的不知道如何处理它。

Spring 已经将已检查的 JDBC 异常转换为信息量更大的未检查异常,这与服务层事务配合得很好。您所有的自定义检查异常都会迫使您输入更多内容。 Spring 给你合理的默认值,好好利用它们。

创建异常处理程序。 Spring 有多种方法来实现这一点,none 其中涉及为控制器中的异常编写捕获块。

将业务逻辑放在服务中,而不是控制器中。您的 findByUsername 和 register 似乎可以合并为一种事务服务方法。