神武舞 2020-12-17 10:27 采纳率: 100%
浏览 2302
已结题

使用AopContext.currentProxy() 获取代理对象不正确,这个问题应该如何定位

使用AopContext.currentProxy() 获取代理对象时,获取结果不是当前对象的类,变成了另外一个对象

1、没有报错(如果当前对象没有代理应该报错)

2、怀疑threadlocal被污染,没有证据,确实有使用,但是应该不会影响到Current AOP proxy

3、怀疑向threadlocalmap添加代理对象时错乱,太多了没有跟踪到,没有证据

spring版本:5.1.13.release jdk:1.8  springboot:2.1.13.release

//代码如下
System.out.println("=========================================>" + this.toString());
System.out.println("=========================================>" + AopContext.currentProxy());

//日志结果如下
=========================================>OrderItemNode{orderItemId='BD22425420121615000607329', coordinate=0.0.0.3, stepType=COMMON, stepId='BusiDet', status=DEALING, orderItemFieldBitmap=5377687649, parentId='BP22929120121615000607317'} CommonNode{fsmInsId='null', contKey='null'}
=========================================>OrderItemNode{orderItemId='OI22425420121710000607900', coordinate=0.0.0.3.1, stepType=WORK_ORDER, stepId='SMS', status=SUBMITTING, orderItemFieldBitmap=1082982432, parentId='BD22425420121615000607329'} 
  • 写回答

4条回答 默认 最新

  • 游刃+ 2021-07-07 16:58
    关注

    因为你的当前类没有被代理,
    在aop进入切面方法的时候,有一个aop的拦截器(DynamicAdvisedInterceptor)会为这个线程设置当前的代理类。
    注意我的用词,”为这个线程“!也就是AopContext.currentProxy()获取的并不是当前类的代理对象,而是当前线程最近设置进去的代理对象。
    所以当这个类没有代理对象的时候,获取的可能就是: 当前线程 前一个被代理类 的代理对象【有点拗口,多理解下】

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 8月14日
  • 已采纳回答 8月6日

悬赏问题

  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 LiBeAs的带隙等于0.997eV,计算阴离子的N和P
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘
  • ¥15 来真人,不要ai!matlab有关常微分方程的问题求解决,
  • ¥15 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿
  • ¥15 回答4f系统的像差计算