【问题标题】:Exception Handling with Spring's @Transactional使用 Spring 的 @Transactional 处理异常
【发布时间】:2012-11-25 18:57:45
【问题描述】:

我正在使用 Spring MVC 和 hibernate 开发一个 Web 应用程序以实现持久性。 鉴于我的 DAO,其中 GenericDao 具有 SessionFactory 成员属性:

@Repository
public class Dao extends GenericDao {
    public void save(Object o) {
        getCurrentSession().save(o);
    }
}

还有一个服务类

@Service
public class MyService {
    @Autowired
    Dao dao;

    @Transactional
    public void save(Object o) {
        dao.save(o);
    }
}

如果发生持久性异常(约束、重复等),我想通知我的用户。据我所知,@Transactional 注释仅在异常冒泡并且事务管理器回滚时才有效,因此我不应该在该方法中处理异常。我应该在哪里以及如何捕获可能在 DAO 中发生的异常,以便我可以直接将其呈现给我的用户,或者将其包含在我自己的异常中?

我想使用spring的事务支持。

【问题讨论】:

    标签: java spring hibernate spring-mvc


    【解决方案1】:

    Spring 提供异常处理程序。

    http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mvc.html#mvc-exceptionhandlers

    所以您可以在控制器中使用类似的东西来处理 ConstraintViolationException

      @ExceptionHandler(ConstraintViolationException.class)
      public ModelAndView handleConstraintViolationException(IOException ex, Command command, HttpServletRequest request) 
    {
        return new ModelAndView("ConstraintViolationExceptionView");
    }
    

    【讨论】:

    • 没有异常(选中或未选中)转义使用@Transactional 注释的服务方法的问题。它在内部被捕获并且事务被回滚。所以你无权访问它。我很好奇,好像有办法在使用@Transactional的同时获得它
    • 这仅在您使用控制器时有效。例如,如果您正在处理 Kafka 消息,而不是 HTTP 请求,那么这是没有用的
    【解决方案2】:

    在解决了这个问题一段时间后,我通过使用异常处理程序(如另一个答案中所述)和@Transactional 注释的rollbackFor 属性解决了这个问题:

    @Transactional(rollbackFor = Exception.class)
    

    我的异常处理程序仍然被调用并相应地写入响应,但事务被回滚。

    【讨论】:

    • @Transactional 将回滚任何未经检查的异常。你只需要显式声明检查的异常。
    • 我现在意识到我没有明确表示我正在使用异常处理程序,正如您在该线程的另一条评论中所描述的那样,这是有问题的。我编辑了我的答案,以反映我将这两件事结合使用来解决我的问题。
    • 无需道歉。 Session#save 没有声明任何已检查的异常,即。它不能抛出任何已检查的异常。所以在你的场景中,你必须有其他东西抛出检查异常,这就是你需要rollbackFor的原因。
    • 我正在抛出异常,但添加异常处理程序会使 Spring 提交。通过添加 rollbackFor 参数,我能够保留异常处理程序,但会导致异常回滚,即使我的处理程序处理了它们。
    • 是的,我同意你的看法。
    猜你喜欢
    • 2018-10-13
    • 2015-01-03
    • 2012-06-22
    • 2019-06-30
    • 1970-01-01
    • 1970-01-01
    • 2013-10-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多