Spring中com.sun.proxy.$Proxy12 cannot be cast to 包名.类名错误

错误原因:

 spring中的aop会使用jdk的动态代理或者cglib为目标对象创建代理。如果被代理的目标实现了至少一个接口,则会使用jdk动态代理;如果没有实现任何接口,则使用cglib代理。如果被代理目标类既没有实现接口,又没有引入cglib,就会报这个错误。

解决方法:

 

  (1)为被代理的目标实现一个接口

  (2)导入cglib的包,然后加上

1 <aop:aspectj-autoproxy proxy-target-class="true"/> 

 第一种解决方法代码如下:

1        //其中UserServiceImpl是接口实现类,UserService是接口
2        //当使用接口实现类获取时会出现异常
3        UserServiceImpl userService = (UserServiceImpl) 
4        applicationContext.getBean("userService");
5        
6         //当使用接口获取时不会出现异常
7         UserService userService1 = (UserService) applicationContext.getBean("userService1");
8       

原因:不能用接口的实现类(UserServiceImpl01_AOP)来转换Proxy的实现类,它们是同级,应该用共同的接口来转换。

使用第二种解决方法 两种方式获取都不会报异常。

posted on 2018-07-28 18:19  走-走  阅读(1533)  评论(1编辑  收藏  举报