Bean named 'rateBoardService' is expected to be of but was actually of type 'com.sun.proxy.$Proxy69'
·
Bean named 'rateBoardService' is expected to be of type 'xxxx'
今天在写一个测试用例的时候遇到个Bug,提示语如下:
可以只看第一行
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'com.joinpay.cb.service.rate.service.RateBoardServiceTest': Unsatisfied dependency expressed through field 'rateBoardService';
nested exception is org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named 'rateBoardService' is expected to be of type 'com.joinpay.cb.service.rate.service.RateBoardService'
but was actually of type 'com.sun.proxy.$Proxy69'
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:588)
at ......
查阅了网上的资料,发现有两种答案
1、用实现类接收注入
2、AOP切面中,使用jdk的动态代理注入还是CGLib动态代理技术织入增强
解决方法
1、本身是一个service项目,不存在切面,因此排除了第二种。
在注入实例的时候使用了具体的实现类去接收,导致这个问题出现
@Transactional
public class RateBoardServiceTest extends SpringJunitSupport {
/***
* RateBoardService 是具体的实现类,非接口
*/
@Autowired
private RateBoardService rateBoardFacade;
public RateBoard getRateBoard(){
RateBoard rateBoard = new RateBoard();
rateBoard.setCurtypeFrom("844");
rateBoard.setCurtypeTo("036");
rateBoard.setBankType("1001");
return rateBoard;
}
@Test
@Rollback(value = false)
public void testCreate(){
RateBoard rateBoard = this.getRateBoard();
assertEquals(true, rateBoardFacade.saveRateBoard(rateBoard));
}
}
然后修改为接口接收
@Autowired
private RateBoardFacade rateBoardFacade;
这时就不会报错了。
心得:
第一次遇到这个问题,看网上博文说,CGLIB代理还是JDK代理一脸懵逼。
这时候要区分两种情况。如果说是web项目,对外有切面的配置,才要去检查CGLIB代理还是JDK动态代理
而且如果不是新项目的话,别人的测试用例没有问题,而你的测试用例有问题,考虑一下第一种情况。
希望对你们有帮助
下一篇,有空详细说一下CGLIB代理和JDK代理区别
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)