SpringAop报错com.sun.proxy.$proxy7

SpringAop报错com.sun.proxy.$proxy7

报错信息:org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named 'monkey' is expected to be of type 'com.pig.spring.aop.aspectj.SmartMonkey' but was actually of type 'com.sun.proxy.$Proxy18'

错误原因:

### 关于 `com.sun.proxy.$Proxy99.setCronTrigger` 方法不存在的异常解决方案 当遇到 `java.lang.NoSuchMethodException: com.sun.proxy.$Proxy99 setCronTrigger` 这类异常时,通常是因为代理对象无法找到指定的方法。Spring 使用动态代理来增强目标对象的功能,在某些情况下可能会导致方法调用失败。 #### 1. 动态代理的工作原理 在 Spring 中,如果配置了事务管理或其他 AOP 切面,则会创建一个代理对象来包裹实际的目标对象。对于接口实现类,默认采用 JDK 动态代理机制;而对于未实现任何接口的情况则使用 CGLIB 来生成子类作为代理[^1]。 #### 2. 解决方案一:确保设置属性通过公共 setter 方法完成 为了避免直接操作代理实例引发的问题,建议始终利用 Bean 定义中的标准方式——即通过公开的 Setter 方法来进行依赖注入或属性赋值: ```xml <bean id="cronTriggerFactoryBean" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> <!-- 配置触发器细节 --> </bean> <bean id="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="cronTriggerFactoryBean"/> </list> </property> ... </bean> ``` 这样可以保证即使存在多层代理也不会影响到正常的业务逻辑执行流程。 #### 3. 解决方案二:调整代理模式为基于类而非接口的方式 有时为了绕过由JDK代理带来的局限性(比如只能代理实现了特定接口的对象),可以选择让 Spring 使用 CGLIB 库来自动生成继承自原始类型的子类形式的新代理对象。这可以通过修改应用程序上下文配置文件中的 `<aop:config>` 或者全局启用此特性来达成目的: ```properties spring.aop.proxy-target-class=true ``` 或者在 Java Config 中: ```java @Configuration @EnableAspectJAutoProxy(proxyTargetClass = true) public class AppConfig { } ``` 这样做之后,所有的切面都将作用于具体的类而不是它们所实现的接口上,从而解决了由于缺少相应方法而导致的运行期错误[^2]。 #### 4. 解决方案三:检查并修正 Quartz Job 实现类的设计 考虑到 Quartz 和 Spring 结合使用的场景下可能出现序列化问题,应当特别注意如何设计任务作业 (Job) 类。具体来说就是避免将非 transient 字段加入其中,因为这些字段会在持久化过程中被尝试保存下来,进而可能引起兼容性方面的问题。推荐做法是从 `QuartzJobBean` 继承,并重写其内部处理函数以减少不必要的复杂度[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值