使用Spring的@Transactional进行异常处理

时间:2012-12-07 15:10:41

标签: java spring hibernate spring-mvc

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

2 个答案:

答案 0 :(得分:4)

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");
}

答案 1 :(得分:0)

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

@Transactional(rollbackFor = Exception.class)

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