java.lang.ClassCastException: com.sun.proxy.$Proxy* cannot be cast to***問題解決方案
臨床表現
病例
定義代理類:
@Transactional @Repository public 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方法。由於UserDAOImpl實現了UserDAO接口,所以強制轉換必須用父類UserDAO來定義
解決方法
如果你的代理對象沒有實現接口的方法,就將代理對象轉換成接口。
獲取代理類的代碼該為:
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); UserDao userDao = (UserDaoImpl)ctx.getBean("userDaoImpl");