標籤:spring
臨床表現:
- 使用Spring AOP動態代理;
- 使用Spring管理的bean類繼承自某個介面;
- Spring容器中有你要代理的bean的id,但是該id不能強制轉換成Bean類。
病例:
定義代理類:
@Transactional@Repositorypublic UserDaoImpl implements UserDao extends BaseDaoImpl{/*沒有實現任何介面*/}
擷取代理類:
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");UserDaoImpl userDaoImpl = (UserDaoImpl)ctx.getBean("userDaoImpl");
報錯:
java.lang.ClassCastException: com.sun.proxy.$Proxy12 cannot be cast to UserDaoImpl
病因:
對於Spring AOP 採用兩種代理方法,一種是常規JDK,一種是CGLIB,我的UserDao了一個介面IUserDao,當代理對象實現了至少一個介面時,預設使用JDK動態建立代理對象,當代理對象沒有實現任何介面時,就會使用CGLIB方法。點此查看詳細介紹>>>
治療方法
如果你的代理對象沒有實現介面的方法,就將代理對象轉換成介面。
擷取代理類的代碼該為:
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao = (UserDaoImpl)ctx.getBean("userDaoImpl");
java.lang.ClassCastException: com.sun.proxy.$Proxy* cannot be cast to***問題解決方案