簡體   English   中英

java.lang.ClassCastException的含義:someClass與someClass不兼容

[英]Meaning of java.lang.ClassCastException: someClass incompatible with someClass

我在XPage應用程序中經常遇到異常:

java.lang.ClassCastException: someClass incompatible with someClass.

兩個提到的類都是相同的,它是用作會話bean的類。 我無法谷歌任何覆蓋我的問題的東西。 對此的通常解釋是設計元素的變化,而不是我的情況。

從那時起,直到重啟http任務或重新保存faces-config.xml,XPage應用程序變得不可用(使用會話bean someClass的頁面)。

在某些情況下,這與其他例外有關:

com.ibm.jscript.InterpretException: Script interpreter error, line=x, col=y: 
Java method 'method(signature containg someClass)'
on java class 'someOtherClass' not found

這種行為的背后是什么?

Philippe Riand通過電子郵件解釋了這一點:

發生此類強制轉換是因為同一個類已被兩個不同的類加載器加載兩次。 因此,從Java的角度來看,它們是不同的,並且轉換失敗。

現在,每個XPage應用程序都有自己的類加載器。 但是,每次通過Domino Designer進行設計更改時,都會丟棄此類加載器。 這是必需的,因為對XPages的更改會生成一個新的Java類,然后應該加載而不是前一個。 發生這種情況時,將丟棄類加載器並創建一個新的。 然后,所有與應用程序相關的類都會在需要時重新加載,即使它們沒有更改。這是J2EE服務器實現的常見行為。 也就是說,如果您的代碼正在緩存范圍中的對象,而該范圍在設計更改發生時未被丟棄,則可能會發生這種情況。 例如,當設計更改發生時,當前不會丟棄applicationScope和sessionScope,這可能會導致此問題。 這是一種設計選擇,因為丟棄范圍有時會提供糟糕的開發人員體驗,但有這個缺點。

最后,保存faces-config.xml可以解決此問題。 保存此文件后,整個模塊將從內存中丟棄,包括范圍,這就解釋了它的工作原理。 對自定義Java類進行更改應重新加載模塊並刪除該問題。

因此,似乎將bean(甚至間接)放入sessionScope或applicationScope是原因。

如果在不同的類加載器中加載相同的類文件,則兩個生成的Java類不是同一個類; 你不會被允許將一個實例傳遞給期望另一個的函數。 通常,如果您遇到這種問題,那是因為您有多個子類加載器可以訪問其公共父類加載器不可見的jar文件。 您可能需要將包含“someclass”的jar移動到公共庫目錄而不是(例如)特定的webapp目錄。

把我的經驗放在這里。

當我遇到這個問題時,我在帶有多個JVM的CAT環境中運行我的應用程序。 因為在ITG環境中為我成功運行了相同的構建,所以我重新啟動了CAT上的兩個JVM並且錯誤已得到解決。 不完全確定導致它的原因。

清潔項目也使這個工作!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM