解决spring使用动态代理类型转换失败的问题--java.lang.ClassCastException: com.sun.proxy.$Proxy$ cannot be cast to ...今天
2016-11-28 15:45
2401 查看
原文出处:http://blog.csdn.net/yinzn2011/article/details/46455973
今天在学习spring aop中的动态代理时,碰到了一个类型转换的问题:Java.lang.ClassCastException:
com.sun.proxy.$Proxy8 cannot be cast to com.bjsxt.service.UserServiceImpl01_AOP.
首先介绍一下spring的动态代理。
spring使用的动态代理有两种:JDK Proxy 和CGLIB。使用前者必须实现至少一个接口才能实现对方法的拦截。使用后者需要两个jar包:asm.jar和cglib.jar,并修改spring配置文件。
我在测试时使用了JDK
Proxy,经过查找资料找到了问题的原因。下面是我的测试用例:
ApplicationContext ac = new ClassPathXmlApplicationContext("./com/bjsxt/springconfig/annotation_01_AOP.xml");
UserServiceImpl01_AOP userService = (UserServiceImpl01_AOP)ac.getBean("userServiceImpl01_AOP");
userService.method3();
原因:红色部分即为报错的根源。不能用接口的实现类(UserServiceImpl01_AOP)来转换Proxy的实现类,它们是同级,应该用共同的接口来转换。将红色代码修改:
UserService01_AOP userService = (UserService01_AOP)ac.getBean("userServiceImpl01_AOP");//UserService01_AOP是接口
修改之后,程序运行正常。
读者可以了解一下JDK Proxy的工作原理,然后会很容易理解这个错误出现的原因。
今天在学习spring aop中的动态代理时,碰到了一个类型转换的问题:Java.lang.ClassCastException:
com.sun.proxy.$Proxy8 cannot be cast to com.bjsxt.service.UserServiceImpl01_AOP.
首先介绍一下spring的动态代理。
spring使用的动态代理有两种:JDK Proxy 和CGLIB。使用前者必须实现至少一个接口才能实现对方法的拦截。使用后者需要两个jar包:asm.jar和cglib.jar,并修改spring配置文件。
我在测试时使用了JDK
Proxy,经过查找资料找到了问题的原因。下面是我的测试用例:
ApplicationContext ac = new ClassPathXmlApplicationContext("./com/bjsxt/springconfig/annotation_01_AOP.xml");
UserServiceImpl01_AOP userService = (UserServiceImpl01_AOP)ac.getBean("userServiceImpl01_AOP");
userService.method3();
原因:红色部分即为报错的根源。不能用接口的实现类(UserServiceImpl01_AOP)来转换Proxy的实现类,它们是同级,应该用共同的接口来转换。将红色代码修改:
UserService01_AOP userService = (UserService01_AOP)ac.getBean("userServiceImpl01_AOP");//UserService01_AOP是接口
修改之后,程序运行正常。
读者可以了解一下JDK Proxy的工作原理,然后会很容易理解这个错误出现的原因。
相关文章推荐
- 解决spring使用动态代理类型转换失败的问题--java.lang.ClassCastException: com.sun.proxy.$Proxy$ cannot be cast to ...
- 解决spring使用动态代理类型转换失败的问题--java.lang.ClassCastException: com.sun.proxy.$Proxy$ cannot be cast to ...
- Java-Spring:java.lang.ClassCastException: com.sun.proxy.$Proxy* cannot be cast to***问题解决方案
- java.lang.ClassCastException: com.sun.proxy.$Proxy* cannot be cast to***问题解决方案
- Spring+hibernate中的问题解决:java.lang.ClassCastException: $Proxy6 cannot be cast to com.mqEsb.service.imp
- 关于使用动态代理创建代理对象是报错 java.lang.ClassCastException: $Proxy0 cannot be cast to 的解决办法
- 异常-----springmvc + ajaxfileupload解决ajax不能异步上传图片的问题。java.lang.ClassCastException: org.apache.catalina.connector.RequestFacade cannot be cast to org.springframework.web.multipart.
- 【问题解决:连接异常】 java.lang.ClassCastException: java.math.BigInteger cannot be cast to java.lang.Long
- Validator问题及解决办法——java.lang.ClassCastException: org.apache.struts.validator.ValidatorForm cannot be cast to forms.RegisterForm
- 解决EJB本地调用“java.lang.ClassCastException: $Proxy96 cannot be cast to com.tgb.ejb.UserManager”异常
- SSH整合时执行hibernate查询报错:java.lang.ClassCastException: com.ch.hibernate.Department_$$_javassist_0 cannot be cast to javassist.util.proxy
- 在maven项目中使用apache cxf中遇到异常 java.lang.ClassCastException: org.springframework.web.filter.CharacterEncodingFilter cannot be cast to javax.servlet.Filter
- 关于Spring事务代理类型转换问题($ProxyXX cannot be cast to 类型)(一)
- 关于Spring事务代理类型转换问题($ProxyXX cannot be cast to 类型)(二)
- Spring AOP代理时 ClassCastException: $Proxy0 cannot be cast to (类型转换错误)
- 奇怪的hibernate 的类型转换错误: java.lang.ClassCastException: java.lang.Boolean cannot be cast to java.lang
- 解决EJB本地调用“java.lang.ClassCastException: $Proxy96 cannot be cast to com.tgb.ejb.UserManager”异常
- 问题 java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to
- java.lang.ClassCastException:android.os.BinderProxy cannot be cast to com.
- Caused by: java.lang.ClassCastException: org.springframework.web.SpringServletContainerInitializer cannot be cast to javax.servlet.ServletContainerInitializer错误解决办法