请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

老师,我在编写自研框架时,使用JDK动态代理生成代理类的话,在进行IOC时会报错

老师,我在编写自研框架时,使用JDK动态代理生成代理类完成逻辑织入后,下一步进行IOC时会报错。

java.lang.IllegalArgumentException: Can not set com.zjc.shop.service.RegisterService field com.zjc.shop.controller.UserController.registerService to com.sun.proxy.$Proxy16

我debug了一下发现是因为在aspect的织入逻辑中把容器里面被代理的bean替换成了代理类的bean,但是key还是被代理类class的,因此在进行IOC时会获取到被代理类的Filed字段进行依赖注入,但是代理类的bean好像没有了成员变量,所以报错。想请教一下老师,Spring框架中是如何解决这个问题的?

正在回答

2回答

翔仔 2020-09-21 01:22:44

同学好,能否举例说明一下,没太明白同学的意思呢,是说自己引用了自己么 ,有没有相关的代码?

0 回复 有任何疑惑可以回复我~
提问者 weixin_慕仙6522334 2020-09-21 12:59:43
  1. 我有一个bean UserServiceImpl,它需要注入另外一个bean UserMapper

    https://img1.sycdn.imooc.com/szimg/5f6828da0971089207210254.jpg

  2. 在AOP的时候我使用代理类的bean Proxy$UserServiceImpl替换了被代理类的bean UserServiceImpl

    https://img1.sycdn.imooc.com//szimg/5f682993092f0f2b09980173.jpg

  3. 最后进行IOC的依赖注入(DI)的时候出错。因为我使用jdk动态代理生成的bean Proxy$UserServiceImpl没有了UserMapper成员变量。

    https://img1.sycdn.imooc.com//szimg/5f682b1809ec870208900226.jpg

    https://img1.sycdn.imooc.com//szimg/5f682cac09aca50205970307.jpg



0 回复 有任何疑惑可以回复我~
  • 翔仔 #1
    理解了,同学好调试一下看看,当时代理类里面能否获取到被代理类的成员变量,应该是能够获取到的,如果能获取到,看看注解的信息是不是还保留着,因为spring里面创建代理的用法和我们这边差不多。
    回复 有任何疑惑可以回复我~ 2020-09-22 01:20:29
  • 提问者 weixin_慕仙6522334 回复 翔仔 #2
    好的,谢谢老师
    回复 有任何疑惑可以回复我~ 2020-09-22 12:10:03
  • 你好,你解决了嘛? 我使用CGLIB代理遇到了同样的问题,在给Controller注入Service属性的时候包无法注入的异常,异常信息:
    Caused by: java.lang.IllegalArgumentException: Can not set com.simple.service.DemoService field com.simple.controller.DemoController.demoService to org.simpleframework.core.annotation.Controller$$EnhancerByCGLIB$$9467a766
    	at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167)
    	at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:171)
    	at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:58)
    	at sun.reflect.UnsafeObjectFieldAccessorImpl.set(UnsafeObjectFieldAccessorImpl.java:75)
    	at java.lang.reflect.Field.set(Field.java:764)
    	at org.simpleframework.util.ClassUtil.setField(ClassUtil.java:131)
    	... 70 more
    回复 有任何疑惑可以回复我~ 2023-03-07 23:39:44
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信