Getting Spring Error “Bean named 'x' must be of type [y], but was actually of type [$Proxy]” in Jenk

本文介绍如何在Spring配置文件中使用AOP进行代理类配置。通过设置proxy-target-class属性为true,可以确保目标类被CGLIB代理而不是传统的Java动态代理。

在 Sping 的配置文件中对 aop : config 加入下面的设置

<aop:config proxy-target-class="true"/>
`com.sun.proxy.$Proxy184` 类型问题通常表现为 `ClassCastException` 或 `BeanNotOfRequiredTypeException` 等异常。从引用的资料来看,这些问题往往与动态代理有关。 在 Spring AOP 场景中,当使用基于 JDK 的动态代理时,代理对象的类型会是 `com.sun.proxy.$ProxyXXX` 形式。若代码尝试将代理对象强制转换为具体的实现类,就会抛出 `ClassCastException` 异常。比如,若期望获取 `SmartMonkey` 类型的 Bean,实际得到的却是 `com.sun.proxy.$Proxy18` 类型,就会引发 `BeanNotOfRequiredTypeException` 异常 [^2]。 而在使用 MyBatis 时,动态代理的第二个参数要求传入 `daoInterFaceClass` 这个 `class` 对象下的所有接口。若外侧代码是父类接口指向子类实现,可能会导致 `daoInterFaceClass.getInterfaces()` 返回不符合预期的结果,最终引发 `ClassCastException` 异常 [^3]。 针对这些问题,可采取以下解决办法: 1. **使用接口类型接收对象**:避免将代理对象强制转换为具体实现类,而是使用接口类型来接收对象。以 Spring AOP 为例,若有 `StudentService` 接口及其实现类,代码应使用 `StudentService` 接口来获取容器对象,而非具体的实现类: ```java @Autowired private StudentService studentService; // 使用接口类型接收 ``` 2. **检查动态代理参数**:在使用动态代理时,要确保传入的参数正确。若出现问题,可尝试直接传入接口类型。以 MyBatis 为例,若代码存在问题,可直接传入接口: ```java IUserDao userDao = session.getMapper(IUserDao.class); // 直接传入接口 ``` 3. **配置 Spring AOP 使用 CGLIB 代理**:Spring AOP 默认使用 JDK 动态代理,若要代理具体类而非接口,可配置使用 CGLIB 代理。在 Spring Boot 项目中,可通过在配置类上添加 `@EnableAspectJAutoProxy(proxyTargetClass = true)` 注解来开启 CGLIB 代理: ```java import org.springframework.context.annotation.Configuration; import org.springframework.aop.aspectj.annotation.EnableAspectJAutoProxy; @Configuration @EnableAspectJAutoProxy(proxyTargetClass = true) public class AppConfig { // 配置类内容 } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值