如何解决从spring容器里拿到一个被代理过的对象 而不是自己声明的实现类对象

场景

当xml文件中存在这样的配置时 

场景

而当你在写case使用@XAutowire使用接口注入时,会报一下异常信息

org.springframework.beans.factory.BeanNotOfRequRequiredTypeException: Bean named 'bankTockenService' is expected to be of type 'e 'com.mybank.bkebank.biz.shared.tocken.BankTockenSernServiceImpl' but was actually of type 'e 'com.sun.proxy.$xy.$Proxy401'

大概的意思是:你申明的是protected BankTockenServiceImpl bankTockenService,但是你从module= "com.mybank.bkebank.biz.shared" 这个spring容器里拿到一个被代理过的对象 是Proxy类型的

解决方法(这里以TestNG为例):

第一步

在case中使用工具类获取到真正的实现类对象

@BeforeClass
@Override
public void setUp(){
    workOrderTaskApprovalQueryManager = BeanUtil.getTargetBean(workOrderTaskApprovalQueryManager);
}

第二步

在需要使用实现类的地方,将接口强转这里不再多述

下面是BeanUtil具体实现有兴趣的可以看下

public class BeanUtil {

    public  static <T> T getTargetBean(Object bean) {
        Object object = bean;
        while (AopUtils.isAopProxy(object)) {
            try {
                object = ((Advised) object).getTargetSource().getTarget();
            } catch (Exception e) {
                throw new RuntimeException("get target bean failed", e);
            }
        }
        return (T) object;
    }
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值