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

2018-10-07  本文已影响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配置文件。我没有使用,有机会再进行了解吧。

上一篇下一篇

猜你喜欢

热点阅读