处理dao的预期异常



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

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

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

  2. 在控制器中使用像userService.findByUsername(username)这样的行(它返回一个Optional),如果它存在,我甚至在调用userService.register(..)

    之前通知用户

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

Spring已经将已检查的JDBC异常转换为更多信息的未检查异常,这可以很好地与服务层事务配合使用。所有自定义检查异常所做的就是强迫您输入更多的内容。春天给你合理的默认值,利用它们。

创建异常处理程序。Spring有多种方法来实现这一点,它们都不需要在控制器中为异常编写catch块。

将业务逻辑放在服务中,而不是控制器中。似乎你的findByUsername和register可以组合在一个事务性服务方法中。

最新更新