Spring的@Transactional的异常处理

Sot*_*lis 6 java spring hibernate spring-mvc

我正在使用Spring MVC开发一个Web应用程序,并为保持持久性而休眠。给我的DAO,其中GenericDao具有SessionFactory成员属性:

@Repository
public class Dao extends GenericDao {
    public void save(Object o) {
        getCurrentSession().save(o);
    }
}
Run Code Online (Sandbox Code Playgroud)

还有一个服务班

@Service
public class MyService {
    @Autowired
    Dao dao;

    @Transactional
    public void save(Object o) {
        dao.save(o);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

我想使用spring的交易支持。

kwh*_*kwh 5

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");
}
Run Code Online (Sandbox Code Playgroud)

  • 问题在于,没有异常(检查或未检查)可以逃脱用“@Transactional”注释的服务方法。它被内部捕获并且事务被回滚。所以你无权访问它。我很好奇是否有一种方法可以在仍然使用“@Transactional”的情况下获取它 (2认同)