【问题标题】:`@Transactional` not working for Spring 2 controller`@Transactional` 不适用于 Spring 2 控制器
【发布时间】:2020-06-15 13:42:41
【问题描述】:

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

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

编辑:所以人们要求可重现的代码示例。问题不在于业务逻辑代码,我正在寻找关于 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 {
    ...
    }
}

【问题讨论】:

  • @Lino 这是一个方法的注释,我在这里没有可以给你的可重现的例子,特别是因为代码是商业敏感的,我不能在公共论坛上发布它,它不会t 提供有关问题所在的任何指示。
  • 可重现示例的目的之一是让 asker 更好地理解问题。您首先创建一个简单的示例,它可以工作,因此您可以通过逐渐从示例移到实际代码中的配置来检查示例和实际代码之间的差异。否则它将不起作用,您在此处发布简单示例,以便我们提供帮助。如果没有看到不起作用的代码,恐怕很难理解问题并提供帮助。
  • @RomanKonoval 我拥有的业务逻辑代码不是问题,它是我需要澄清的弹簧控制器中注释的使用。我可以发布一些伪代码,但你会发现它对任何人都没有好处。

标签: java spring spring-transactions


【解决方案1】:

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

而且这种情况下直接调用,默认的spring事务处理不起作用。

请参阅this question 中的答案,了解您拥有的选项的详细说明

【讨论】:

  • 所以看起来这个答案最适合我的场景:stackoverflow.com/a/3429757/3415090,我们已经有了<tx:annotation-driven mode="aspectj"/>,但是添加<bean class="org.springframework.transaction.aspectj.AnnotationTransactionAspect" factory-method="aspectOf"> <property name="transactionManager" ref="transactionManager" /></bean>会在启动时破坏应用程序,因为我认为这会干扰其他注释在我们的 spring 3 控制器中使用的系统中。
  • 也许是因为在我们的系统中设置控制器的不同方式的混乱意味着这个问题没有可行的解决方案。
  • 我认为我唯一真正可行的选择是创建一个服务类,将其实例化为可以从控制器调用的单独 bean。我很确定这会奏效。感谢您的链接。
猜你喜欢
  • 2017-02-17
  • 2011-01-22
  • 1970-01-01
  • 1970-01-01
  • 2018-08-10
  • 1970-01-01
  • 2020-10-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多