调用TransactionAspectSupport.currentTransactionStatus().setRollbackOnly()时遇到的一些问题

之前在其他地方写的,一直要求手机验证,之前能跳过,麻烦点就麻烦点了.今天编辑文章的时候直接不能改了.无奈~~~~~~~~~~~

如果手动调用 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();会报如下错误

org.springframework.transaction.NoTransactionException: No transaction aspect-managed TransactionStatus in scope

debug后发现他没有进代理方法,在我这出现这种问题是因为我在dispatcher-servlet.xml里写了`<context:component-scan base-package="com.xxx" />`而在applicationContext.xml里没有注解扫描的配置.所以我怀疑就是因为没正确加载对象导致的问题.

然后我把注解扫描分成两个部分

    <context:component-scan base-package="com.xxx"  >
        <context:exclude-filter expression=".+Controller" type="regex"/>
    </context:component-scan>
    <context:component-scan base-package="com.xxx.controller" />

 

这时候报下面的错

org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named 'xxx' must be of type [com.tuniu.autodeploy.service.Xxx], but was actually of type [com.sun.proxy.$Proxy26]

解决方法:  

<aop:aspectj-autoproxy  proxy-target-class="true"/> 

在网上找了一段相关说明,就是强制使用cglib代理时就把proxy-target-class设为true.

通过aop命名空间的<aop:aspectj-autoproxy />声明自动为spring容器中那些配置@aspectJ切面的bean创建代理,织入切面。当然,spring在内部依旧采用AnnotationAwareAspectJAutoProxyCreator进行自动代理的创建工作,但具体实现的细节已经被<aop:aspectj-autoproxy />隐藏起来了 
<aop:aspectj-autoproxy />有一个proxy-target-class属性,默认为false,表示使用jdk动态代理织入增强,当配为<aop:aspectj-autoproxy  poxy-target-class="true"/>时,表示使用CGLib动态代理技术织入增强。不过即使proxy-target-class设置为false,如果目标类没有声明接口,则spring将自动使用CGLib动态代理。 

这样修改之后就能手动调用回滚了.

 参考

http://kld208.iteye.com/blog/1632935

 

转载于:https://www.cnblogs.com/saias/p/6811941.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,`TransactionAspectSupport.currentTransactionStatus().setRollbackOnly()`用于在Spring事务中手动设置回滚。然而,有候可能会出现回滚失效的情况。这可能是由于以下原因之一导致的: 1. 事务边界问题:`setRollbackOnly()`方法必须在事务边界内调用才能生效。如果该方法在事务外部调用,或者在事务方法的嵌套调用中没有正确传播事务,那么回滚操作可能会失效。 2. 异常处理问题:`setRollbackOnly()`方法通常在捕获到异常后调用,以便手动设置回滚。但是,如果异常没有被正确捕获或处理,或者在异常处理过程中发生了其他异常,那么回滚操作可能会失效。 3. 事务配置问题:回滚操作的有效性还取决于事务的配置。如果事务管理器或事务定义没有正确配置,那么回滚操作可能会失效。 为了解决回滚失效的问题,可以尝试以下方法: 1. 确保`setRollbackOnly()`方法在事务边界内调用,并且事务正确传播到了该方法。 2. 确保异常被正确捕获和处理,并且没有发生其他异常导致回滚失效。 3. 检查事务的配置,确保事务管理器和事务定义正确配置。 下面是一个示例代码,演示了如何正确使用`setRollbackOnly()`方法来手动回滚事务: ```java @Service public class MyService { @Autowired private PlatformTransactionManager transactionManager; public void myTransactionalMethod() { DefaultTransactionDefinition transactionDefinition = new DefaultTransactionDefinition(); TransactionStatus transactionStatus = transactionManager.getTransaction(transactionDefinition); try { // 业务逻辑代码 // 如果出现异常,手动设置回滚 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); } catch (Exception e) { e.printStackTrace(); // 异常处理代码 } if (transactionStatus.isRollbackOnly()) { transactionManager.rollback(transactionStatus); } else { transactionManager.commit(transactionStatus); } } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值