Cannot find current proxy: Set ‘exposeProxy‘ property on Advised to ‘true‘ to make it available
前言
我这儿是在AOP中,通过 ProceedingJoinPoint.getTarget() 获取到 serviceImpl 的 object 实例,然后通过反射调用当前service的其他方法进行返回
报错是因为在反射调用的serviceImpl中的方法中,又去调用了当前serviceImpl中的 @Async 方法
报错正文:
Cannot find current proxy: Set ‘exposeProxy’ property on Advised to ‘true’ to make it available, and ensure that AopContext.currentProxy() is invoked in the same thread as the AOP invocation context.
解决方法
- 添加注解配置项
@EnableAspectJAutoProxy(exposeProxy = true, proxyTargetClass = true)
- exposeProxy = true
指定代理被AOP框架作为ThreadLocal暴露出来,可以被 AopContext 类获取。默认 false
- proxyTargetClass = true
指示是否要创建基于子类(CGLIB)的代理,而不是基于标准Java接口的代理。默认为false。
到这一步后,按网上说的,在被调用的 @Async 方法上再添加事务的注解 @Transactional,然后很遗憾,没什么卵用…
debug观察到,ProceedingJoinPoint.getTarget() 获取到的对象是具体的 serviceImpl实现类,不是cglib的代理类,于是找到了解题思路
- 将反射使用的 object 用Spring的 cglibObject 代替
修改代码,用 cglibTarget 代替 target 来做反射调用
// 这里的pjp 是 AOP 的 ProceedingJoinPoint
Object target = pjp.getTarget();
Class<?> targetClass = target.getClass();
// 使用spring的cglib代理,代替jdk的反射 - 这样在反射调用的方法里,才能使用 @Async 开启异步线程
Object cglibTarget = SpringUtil.getBean((targetClass.getInterfaces()[0]));
亲测OK,可以成功触发 @Async 的异步操作
希望对后面的兄弟们有所帮助或启发
Cannot find current proxy: Set ‘exposeProxy‘ property on Advised to ‘true‘ to make it available相关推荐
- 详细整理Spring事务失效的具体场景及解决方案
实际项目开发中,如果涉及到多张表操作时,为了保证业务数据的一致性,大家一般都会采用事务机制:好多小伙伴可能只是简单了解一下,遇到事务失效的情况,便会无从下手,溪源此篇文章给大家整理了一下常见Sprin ...
- 面试官:Spring事务失效的场景有哪些?如何解决?
作者:溪~源 blog.csdn.net/xuan_lu/article/details/107797505 实际项目开发中,如果涉及到多张表操作时,为了保证业务数据的一致性,大家一般都会采用事务机 ...
- Spring AOP源码分析(四)Spring AOP的JDK动态代理
2019独角兽企业重金招聘Python工程师标准>>> 本篇文章将会介绍上一个例子中的源码执行情况,从中熟悉整个SpringAOP的一些概念和接口设计. 首先整个SpringAOP的 ...
- springboot异步和切面_Spring异步编程 你的@Async就真的异步吗?异步历险奇遇记
引言有点长 前端的宝宝会用ajax,用异步编程到快乐的不行~ 我们java也有异步,用起来比他们还快乐~ 我们biaji一个注(gǒupí)解(gāoyào),也是快乐风男... 且看下面的栗子: 注 ...
- springboot异步和切面_Spring异步编程 | 你的@Async就真的异步吗 ☞ 异步历险奇遇记...
引言有点长 前端的宝宝会用ajax,用异步编程到快乐的不行~ 我们java也有异步,用起来比他们还快乐~ 我们bia~ji~一个注(gǒupí)解(gāoyào),也是快乐风男... 且看下面的栗子: ...
- springboot异步和切面_Spring异步编程 | 你的@Async就真的异步吗?异步历险奇遇记
Spring异步编程 | 你的@Async就真的异步吗?异步历险奇遇记 点击上方"java进阶架构师",选择右上角"置顶公众号" 20大进阶架构专题每日送达 引 ...
- 你否有遇到Spring事务失效,花费太多时间找bug
作者:溪~源 来源:blog.csdn.net/xuan_lu/article/details/107797505 实际项目开发中,如果涉及到多张表操作时,为了保证业务数据的一致性,大家一般都会采用事 ...
- 探究Spring AOP 同类调用失效问题
扯一下沟通 本来这篇文章是想写关于职场上的沟通的,尽管我也是一个初入职场的小白.但是发现时间不太够,只好作罢,后面再补上吧.关于沟通,我总结起来就是"沟通渠道要畅通,沟通要主动,沟通要高效& ...
- Spring声明式事务管理实现及原理详解
目录 1.实现步骤 1.1.配置事务管理器 1.2.启动事务注解 1.3.业务添加注解 2.代码演示 2.1.bean文件 2.2.目标类 2.3.测试类 3.Spring事务属性 3.1.传播行为 ...
- springboot异步和切面_spring中的切面和异步执行
1.首先理解异步和多线程的概念,怎么实现接口的异步调用呢?多线程,这是很多人第一眼想到的关键词,没错,多线程就是一种实现异步调用的方式! 2.下面介绍怎么实现异步调用方式 3.首先如果你的项目是spr ...
最新文章
- SLAM之特征匹配(二)————RANSAC--------翻译以及经典RANSAC以及其相关的改进的算法小结
- 联想杜比音效_联想小新15 2020锐龙版首销;OPPO Find X2系列也可尝鲜安卓11
- redis源码之字符串压缩
- html 怎么自动让图片居中显示,css中怎样让图片居中显示?
- java wait方法_java wait方法
- 深入浅出requireJS-1
- 微型计算机接口技术与汇编语言课后答案
- 登录和注销、基于Session的购物车案例、验证码的使用、防止表单重复提交
- 新浪微博时间格式解析java_仿新浪微博格式化时间
- jdbc basedao mysql_Java使用JDBC连接mysql、sqlserver、orcle数据库的baseDao类
- Android TV开发总结(五)TV上屏幕适配总结
- 589页22万字城市智慧应急指挥中心大数据信息化系统整体设计方案
- 使用Kali Linux系统生成木马病毒并实现远程控制计算机
- sql未保存文档找回
- CSS开发中所有基本属性的使用技巧
- PyTorch 和 TensorFlow的区别
- 计算机毕设之电影购票系统
- 从键盘上输入一个字符,判断并输出是控制符、数字字符、大写字母、小写字母或是其他字符
- Android挂断电话流程
- VC 出错 msdev.exe错误