2013-02-28 96 views
2

我遇到了嘗試在liferay中的portlet之間發送共享自定義對象的嚴重問題。我有一個Hook插件,帶有一個servlet過濾器,它加載一個類型爲MyCustomClass的對象並將其作爲參數插入到請求對象中。在liferay中的portlet之間發送自定義對象

當我嘗試讀取Portlet的render()中的這個對象時,我得到一個ClassCastException,但我將該對象轉換爲同一個類。

據我所知,Liferay的插件有不同的背景,我已經嘗試過在bean和portlet這樣在加載對象前更改類裝載器:

ClassLoader portalcl = PortalClassLoaderUtil.getClassLoader(); 
ClassLoader currentcl = Thread.currentThread().getContextClassLoader(); 
Thread.currentThread().setContextClassLoader(portalcl); 

//do my stuff 

Thread.currentThread().setContextClassLoader(currentcl); 
但是

,它並沒有解決這個問題,我發現解決問題的唯一方法是將對象序列化爲json字符串,並在需要時將其反序列化。

這難道不是跛腳嗎?有誰知道更好的解決方案?

問候,DS

回答

4

這聽起來像你所看到的主要問題是兩個不同的類加載器加載其techncally使他們不同類(好像你已經確定)的類。

我還沒有使用LifeRay,但這是我在其他平臺上看到的問題。我們使用WebSphere並通過將常用MyCustomClass放入服務器類路徑中的共享庫來解決此問題。這樣服務器將加載類,並通過服務器的單個類加載器將其提供給服務器上的所有應用程序。如果你讓每個應用程序加載類,那麼你會繼續看到這個異常。

+0

嗯,我想你是對的,這似乎是最合法的方法,但它使我們的系統管理員的部署過程稍微複雜一些,因爲我們仍處於開發的早期階段,並且將這些類更改爲許多。所以我們最終使用json將對象從一個portlet發送到另一個portlet,直到我們到達更加穩定的狀態,或者直到liferay修復它爲止。感謝您的反饋意見 ! – madoke 2013-03-01 10:54:00

+0

這個線程有點舊了,但是我們最後把所有的bean移動到一個jar文件中,並將這個jar文件放在tomcat的lib目錄中,就像你所建議的一樣。 – madoke 2015-06-16 18:53:01

相關問題