【问题标题】:Spring AOP transaction annotation not working on method invoked using java reflectionSpring AOP事务注释不适用于使用java反射调用的方法
【发布时间】:2014-07-09 13:50:32
【问题描述】:

我的@Transaction 启用类中有一个方法,该方法使用java 反射从外部类调用。不幸的是,Spring Transaction 在此方法中不起作用。 类如下所示:

@Transactional
public class CartServiceImpl implements CartService {

@Autowired
AnnotatedMethodInvoker annotatedMethodInvoker;

@Override
@VersionedParent
public BasicResponse addCartItem(AddCartItemRequest addCartItemRequest) throws Exception{
    String currentMethodName = Thread.currentThread().getStackTrace()[1].getMethodName();
    return (BasicResponse)annotatedMethodInvoker.invoke(this, currentMethodName, addCartItemRequest, AddCartItemRequest.class);
}

@VersionedMethod(parentMethod="addCartItem", minimumVersion=Constants.BUILD_VERSION_1_0_1, description="Added Epoch")
private BasicResponse addCartItemWithEpoch(AddCartItemRequest addCartItemRequest){
      /***** Implementation detail goes here *****/
}

@VersionedMethod(parentMethod="addCartItem", minimumVersion=Constants.BUILD_VERSION_1_0_2, description="Added Cart filter here")
private BasicResponse addCartItemWithCartFilter(AddCartItemRequest addCartItemRequest){
      /***** Implementation detail goes here *****/
}

}

AnnotatedMethodInvoker 类的invoke() 方法中,我调用了两个private 方法中的一个addCartItemWithEpoch()addCartItemWithCartFilter()

问题在于,当发生 RuntimeException 时,事务仍在提交,这实质上意味着 Spring Transaction 在我的私有方法中不起作用。 令人惊讶的是,如果我把它放在我的私有方法中,下面的语句会返回 true:

TransactionSynchronizationManager.isActualTransactionActive()

我的应用程序目前一直在使用 Spring AOP 事务,并且可以无缝运行。 application-config.xml sn -p 下面:

<context:annotation-config />
<context:component-scan base-package="com.apraxalpha.dealernews" />
<tx:annotation-driven />

我已阅读此blog,它建议使用基于 AspectJ 的 Transaction over Spring AOP Transaction 方法。我对此不是很自信,因为我的整个应用程序都在使用基于 Spring AOP 的事务。现在只是为了 1 个单一的实现更改,我不想将所有内容都更改为 AspectJ 事务。 1)在我的应用程序中是否有任何这样的中间路径可以同时使用这两种方法? 2) 有没有其他方法可以让我的私有方法中的 Transaction 使用 java 反射被调用?

【问题讨论】:

    标签: reflection aspectj spring-aop spring-transactions


    【解决方案1】:

    浏览了其他几篇关于类似问题的帖子: 1) Spring Transaction 在调用 Spring Bean 类的私有方法时不起作用或 2) 从同一个类中的另一个方法调用一个方法

    似乎您使用 AspectJ 而不是 Spring AOP 来调用 bean 类方法 或者 如果您不想使用 AspectJ 并坚持使用 Spring AOP,那么对类进行简单的重构将解决以下问题:

    在问题中,方法公共方法 addCartItem 和实际实现方法(实际上具有实现代码)都在同一个 bean 类中。 考虑创建一个委托类作为该 bean 类之上的一个层,并将公共方法 addCartItem 放在该类中。然后将两个私有方法都设为公共,并尝试从委托方法中调用 bean 类方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-19
      • 1970-01-01
      • 2012-11-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多