11

我正在使用 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的事务支持。

4

2 回答 2

7

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");
}
于 2012-12-07T18:55:18.693 回答
2

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

@Transactional(rollbackFor = Exception.class)

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

于 2014-09-30T18:51:32.163 回答