美文网首页
【Java】报错 "com.sun.proxy.$Proxy c

【Java】报错 "com.sun.proxy.$Proxy c

作者: 嗖嗖编程 | 来源:发表于2018-10-07 08:14 被阅读0次

    一.问题分析

    1.报错背景

    遇到这个问题是在类型转换时,如下:

        WebApplicationContext wac = WebApplicationContextUtils.getWebApplicationContext(config.getServletContext());
    
        PassApiServiceImpl service = (PassApiServiceImpl) wac.getBean("passApiService");
    

    2.错误分析

    2.1 知识点:

    Spring AOP实现方式有两种

    1:使用JDK动态代理,如果被代理的目标实现了至少一个接口,则会使用JDK动态代理,所有该目标类型实现的接口都将被代理。

    2:通过CGLIB来为目标对象创建代理,若该目标对象没有实现任何接口,则创建一个CGLIB代理,创建的代理类是目标类的子类。

    2.2 错误分析

    那根据我遇到的情况分析,我的PassApiServiceImpl实现了PassApiService接口,aop应该是使用了JDK Proxy。

    而报错的原因,是不能用接口的实现类(PassApiServiceImpl)来转换Proxy的实现类,它们是同级,应该用共同的接口(PassApiService)来转换。

    二.解决方案

    1.使用接口来进行类型转换,将PassApiServiceImpl改为PassApiService。

        WebApplicationContext wac = WebApplicationContextUtils.getWebApplicationContext(config.getServletContext());
    
        PassApiService service = (PassApiService) wac.getBean("passApiService");
    

    三.其他解决方案

    看到有一种解决方案是强制使用CGLIB创建代理,需要引用jar包并修改spring配置文件。我没有使用,有机会再进行了解吧。

    相关文章

      网友评论

          本文标题:【Java】报错 "com.sun.proxy.$Proxy c

          本文链接:https://www.haomeiwen.com/subject/igwkaftx.html