如何解决从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;
    }
}

 


版权声明:本文为qq_25306579原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。