最近回味SSH框架,发现同事的小bug NoSuchMethod $Proxy.add(), 解决办法和根本原因

选用框架 Spring4+hibernate5+struts2 . 

 原因 : 在配置Aop切点的时候把Action类也拦截了 , 自定义的action是继承自actionSupport的


<aop:pointcut id="" expression="execution(com.XX..*(..))">

最后发现报了这样一个异常: 

java.lang.NoSuchMethodException: $Proxy5.add()
at java.lang.Class.getMethod(Class.java:1605)
at org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.getActionMethod(AnnotationValidationInterceptor.java:55)
at org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:41)
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:86)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
.........


解决方式:

一 . 不要拦截action类 即在execution中写具体的包不要把action包含进去

二.在 <aop:config ,,>上添加 <aop:config proxy-target-class="true"> 即可


原因分析:
分析上述异常 可知  找不到此方法add() .但在action类中 确实有这个方法, 重点就在于 是你的自定义的action类中有此方法,

由于采用的是继承actionSupport类  ,我们看一看源码



   Action是实现了几大接口  . 我们知道 JDK默认的生成代理对象的方案 也就是在JVM内部动态生成class字节码文件的方式去生成代理对象. 是需要代理实现了接口的类的,实现生成代理对象的底层我们下回再讨论。 针对这个问题,那就好办了, add()方法是自定义action中的方法,而实现的接口中并没有add()方法 。而spring默认使用的就是JDK的动态代理方式去实现aop编程,自然在这种情况下,是找不到$Proxy对象中的add()方法的! 故报错 ,如何解决呢?还有另外一种可以不针对接口的代理方式 CGLIB 动态代理: .CGLIB(Code Generation Library)是一个强大的,高性能,高质量的Code生成类库,它可以在运行期扩展Java类与实现Java接口。CGLIB包的底层是通过使用一个小而快的字节码处理框架ASM,来转换字节码并生成新的类. 所以可以在<aop:config 上添加 一句: 

proxy-target-class="true" 就是开启默认使用cglib方式生成代理对象 . 如果没有开启,那么spring会根据类是否实现接口来判断使用何种方式生成代理对象!  

java.lang.NoSuchMethodException: com.sun.proxy.$proxy58.list错误通常出现在使用Java动态代理时,代理对象的方法调用出现错误。这个异常的发生可能有以下几个原因和解决办法: 1. 方法名拼写错误:首先要检查代码中方法名是否拼写正确。使用IDE进行代码拼写检查是一个好的习惯。 2. 参数类型错误:如果方法调用的参数类型与接口或类定义中的参数类型不匹配,也会触发该异常。要确保传入的参数类型与方法定义中的参数类型相符。 3. 对象类型错误:如果方法调用的对象类型与接口或类定义中的对象类型不匹配,也会触发该异常。要确保调用方法的对象是正确的类型。 4. 方法可见性问题:如果方法是私有方法或受保护的方法,并且访问权限不足,则会触发该异常。可以通过更改方法的可见性修饰符来解决这个问题。 5. 类加载问题:可能是由于类加载器的问题导致的。可以尝试清理和重新加载相关的类。 6. 代理类生成问题:Java动态代理使用字节码生成技术来生成代理类,但是如果代理类生成出现问题,例如生成的代理类缺少需要调用的方法,也会出现该异常。可以尝试重新生成代理类。 总结起来,解决java.lang.NoSuchMethodException: com.sun.proxy.$proxy58.list错误的关键是要确保方法调用的正确性,包括方法名、参数类型、对象类型、方法可见性等方面,并且需要检查类加载和代理类生成的相关问题。如果以上方法仍然无效,可能需要进一步排查代码逻辑和调用链的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值