首页 > 解决方案 > `@Transactional` 不适用于 Spring 2 控制器

问题描述

我的应用程序中有一个旧控制器,它在 xml 中定义为 spring bean,并使用 Spring 的SimpleFormController。我试图onSubmit通过添加注释使控制器方法中的进程成为事务性的,@Transactional但它不起作用。根据本指南,注解的调用必须发生在“bean 之外”,这是否意味着注解不能在像我这样的旧 Spring 控制器中使用?是否有任何替代方案或解决方法?

我知道它不起作用的原因是因为 1) 对 db 的更改不会因错误而回滚(尽管我已经定义了这一事实,rollbackFor = Exception.class甚至在某些情况下使用过TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();,在这种情况下它尝试使用后者它抛出一个错误,指出不存在事务。2)我@Transactional在 Spring 中实例化的位置添加了断点,但没有一个被命中。

编辑:所以人们要求可重现的代码示例。问题不在于业务逻辑代码,我正在寻找在 Spring 2 控制器中使用注释的清晰性。所以我的例子是这样的:

public class ImportController extends SimpleFormController {

    @Override
    @Transactional(rollbackFor = Exception.class)
    public ModelAndView onSubmit(HttpServletRequest request, HttpServletResponse response, Object command, BindException errors) throws Exception {
    ...
    }
}

标签: javaspringspring-transactions

解决方案


你说的对。@Transactional在这里不起作用,因为onSubmit是由同一个 bean 调用的。

在这种情况下,调用是直接完成的,默认的 spring 事务处理不起作用。

有关您拥有的选项的详细说明,请参阅此问题中的答案


推荐阅读