当前位置: 首页 > 知识库问答 >
问题:

通过反射调用@Transactional方法时未创建Spring事务

刘运浩
2023-03-14
@Transactional(propagation = Propagation.REQUIRES_NEW)
    public void handleProcess() { ..}
Runnable runnable = null;
Method handleMethod = config.handleProcessMethod;
            Object handler = autowireHandler(process);
            runnable = () -> {
                LOGGER.info("executing method {} on {}",handleMethod,handler);
                handleMethod.invoke(handler);
            };
runnable.run();
08:54:33.452 [process-executor-2] DEBUG o.springframework.orm.jpa.JpaTransactionManager - Found thread-bound EntityManager ... for JPA transaction
08:54:33.453 [process-executor-2] DEBUG o.springframework.orm.jpa.JpaTransactionManager - Participating in existing transaction

编辑:实际上,上面的日志是在被调用的方法中创建的,这是由JPA存储库引起的,而不是在它之前。所以看起来似乎根本没有处理@Transactional注释。

反射是否导致spring错过@Transactional注释?我需要被调用的方法使用它自己的事务,以便在从调用返回之前提交它。

共有1个答案

邢弘业
2023-03-14

注释告诉Spring要用实现事务行为的代理包装什么内容。反射将绕过该代理并直接调用包装的方法。查看日志应该可以确认,您可能需要为spring Stuff拨号日志级别。

不要用反射,因为那是在Spring的背后,它帮不了你。您可以自动生成实现公共接口的服务列表。您的代码可以遍历列表,找出哪一个与您需要做的事情相关,然后调用所选服务的方法。

如果您正在向执行器提交任务,那么当在辅助线程上找不到entitymanager时,您将遇到麻烦。如果您让这些服务使用Spring异步方法,这将让Spring处理事务、entityManager等。

 类似资料:
  • 本文向大家介绍Java通过PropertyDescriptor反射调用set和get方法,包括了Java通过PropertyDescriptor反射调用set和get方法的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了PropertyDescriptor反射调用set和get方法,供大家参考,具体内容如下 第一段: 第二段: 第三段: 以上就是本文的全部内容,希望对大家的学习有所帮助

  • 问题内容: 在 Java中 ,是否可以覆盖使用创建的类中的方法?例如,说我有以下课程: 在一个类中,我想直接创建它并重写其方法,如下所示: 有没有办法以同样的方式使用反射来覆盖方法?也许是这样的吗?: 如果没有,是否还有其他方法可以这样做,或者可以使用外部库吗?我正在寻找将侦听器添加到setter方法以更改绑定值的方法。 问题答案: 不,用您的例子是不可能的。 在您的示例中,Java编译器将创建两

  • 如果反射值对象(reflect.Value)中值的类型为函数时,可以通过 reflect.Value 调用该函数。使用反射调用函数时,需要将参数使用反射值对象的切片 []reflect.Value 构造后传入 Call() 方法中,调用完成时,函数的返回值通过 []reflect.Value 返回。 下面的代码声明一个加法函数,传入两个整型值,返回两个整型值的和。将函数保存到反射值对象(refle

  • 问题内容: 在Spring中,带有注释的方法 将获得一个新的事务(如果还没有),但是我注意到,如果从非事务处理方法调用事务方法,则不会获得任何事务。这是代码。 是一个常规方法,该方法调用是事务性的,但不会保留任何更改。 我正在使用Spring 3和Hibernate3。在这里我做错了什么?谢谢。 问题答案: 这是Springs AOP的局限性之一。因为dao bean实际上是在spring时创建的

  • 问题内容: 我需要获取具有特定批注的字段的值,因此通过反射,我能够获取此Field Object。问题在于,尽管我事先知道它将始终具有getter方法,但该字段将始终是私有的。我知道我可以使用setAccesible(true)并获取其值(当没有PermissionManager时),尽管我更喜欢调用其getter方法。 我知道可以通过查找“ get + fieldName”来查找该方法(尽管例如

  • 我正在查看一些现有的代码,并想知道在下面的场景中使用Spring的@Transactional注释会发生什么?考虑以下示例: 下面的updateDataBaseItem()方法是常见的,可以从其他非事务性方法和上面的方法调用: