2011-04-18 112 views
1

我有以下代碼:ClassCastException異常問題

Object backingBean = facesContextHandler.getBackingBean("UserCredentialsBean"); 
UserCredentialsBean userCredentBean = (UserCredentialsBean) backingBean; 

雖然我調試它,我已經在我的表情下面查看在Eclipse:

backingBean.getClass() - > myPackage.UserCredentialsBean

backingBean}這種myPackage.UserCredentialsBean - >假

所以鑄造上面失敗...

這是怎麼回事?

更新:附加 「症狀」:我得到這個問題的會話超時

任何想法後?

+0

你有沒有堆棧跟蹤? – 2011-04-18 14:53:16

+0

堆棧跟蹤如何幫助? – 2011-04-18 14:56:42

+0

我認爲有一個堆棧跟蹤可能會有所幫助。有可能OP在他的分析中漏掉了某些東西,或者在某處有更多的細節......有更多的信息有人可以幫助更好的機會 – 2011-04-18 15:04:29

回答

4

有趣的問題。我只能想到兩種可能性。

1-空對象。 instanceOf通常對空對象失敗。只要確保bean已初始化。

2類加載器問題。如果兩個相同類的對象由兩個不同的類加載器加載,則instanceOf將失敗。

這不是一個全包的清單,只是我能想到的兩件事。

+0

backingBean不爲null。 Eclipse將顯示其具有數據填充的UserCredentialsBean對象的屬性。 – 2011-04-18 15:01:08

+0

關於類加載器問題...我應該考慮如何發生這些類加載器問題。 – 2011-04-18 15:02:29

+0

然後,您可能需要查看類加載器問題。這是JSF應用程序的權利,您正嘗試在您的應用程序中獲得支持bean。 ?? – 2011-04-18 15:03:20

2

ClassLoader問題肯定。很可能應用程序被重新部署(因此創建了新的類加載器實例),但舊對象保留在(磁盤序列化?)會話或內存中。

類名相同,但類加載器實例不同。 Instanceof查看完整的類名和類加載器的相等性。

P.S.這實際上是一個相當普遍的問題。當後臺線程喚醒時,通常會看到應用程序被重新部署,線程的類加載器不見了,然後它會引發NoClassDefFound或ClassCast,讓開發人員無法意識到這其實是一個殭屍以前的部署,並試圖在代碼中找到一個錯誤。