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

使用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()获取的并不是当前类的代理对象,而是当前线程最近设置进去的代理对象。
    所以当这个类没有代理对象的时候,获取的可能就是: 当前线程 前一个被代理类 的代理对象【有点拗口,多理解下】

    已采纳该答案
    评论
    解决 1 无用
    打赏 举报
  • 神武舞 2020-12-17 15:38

    setCurrentProxy 这个方式是spring内部类方法,外部不能调用;如果真的是没有被代理AopContext.currentProxy() 这个方法是直接抛异常的

    评论
    解决 1 无用
    打赏 举报
  • a1767028198 2020-12-17 11:15

    org.springframework.aop.framework.AopContext#setCurrentProxy 看一下调用链呗,是不是存在自己处理的地方

    或者直接给AopContext.setCurrentProxy 打断点 

    评论
    解决 无用
    打赏 举报
  • a1767028198 2020-12-17 11:17

    最怕的是那个对象 没有被spring管理 获取代理 自然就不是你想要的结果了

    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题