java - `@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 {
...
}
}
解决方案
你说的对。@Transactional
在这里不起作用,因为onSubmit
是由同一个 bean 调用的。
在这种情况下,调用是直接完成的,默认的 spring 事务处理不起作用。
有关您拥有的选项的详细说明,请参阅此问题中的答案
推荐阅读
- azure - 用于更新或插入属于多个分区键的文档的存储过程
- java - java.lang.NoSuchMethodError: com.google.common.base.Stopwatch.createUnstarted()Lcom/google/common/base/Stopwatch
- algorithm - 部分排序序列的最佳排序算法?
- php - 缺少 http 状态代码 102 的响应标头
- sql-server - 如何在 Linux 上为 SQL Server 2017 导出和导入数据库?
- iphone - 带有 Ext JS 现代 6.5.3 的 Safari 浏览器中的 iOS 11.3.1 Iframe 滚动问题
- php - 在 Laravel 中使用 request->all 保存所有记录记录
- c - C - 如何确定 JSON 消息的字节数
- php - 字体系列重叠
- if-statement - 在一个大的 if-else 中管理多个变量