2

Liferayのポートレット間で共有カスタムオブジェクトを送信しようとすると、深刻な問題が発生します。タイプMyCustomClassのオブジェクトをロードし、それをパラメーターとして要求オブジェクトに挿入するサーブレットフィルターを備えたフックプラグインがあります。

ポートレットのrender()でこのオブジェクトを読み取ろうとすると、同じクラスにオブジェクトをキャストしていますが、ClassCastExceptionが発生します。

私はliferayプラグインが異なるコンテキストを持っていることを理解しており、次のようにBeanとポートレットにオブジェクトをロードする前にクラスローダーを変更しようとしました。

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

//do my stuff

Thread.currentThread().setContextClassLoader(currentcl);

ただし、問題は解決しませんでした。問題を解決するために私が見つけた唯一の方法は、オブジェクトをjson文字列にシリアル化し、必要なときにいつでも逆シリアル化することです。

これはちょっとラメじゃないですか?誰かがより良い解決策を知っていますか?

よろしく、DS

4

1 に答える 1

4

あなたが見ている主な問題は、2つの異なるクラスローダーがクラスをロードしていることです。これにより、技術的に異なるクラスになります(すでに決定しているようです)。

私はLifeRayをあまり使用していませんが、これは他のプラットフォームでも見られる問題です。WebSphereを使用していて、サーバーのクラスパス上にある共有ライブラリーに共通のMyCustomClassを配置することで、この問題を解決しました。このようにして、サーバーはクラスをロードし、サーバーの単一のクラスローダーを介してサーバー上のすべてのアプリケーションで使用できるようにします。各アプリケーションにクラスをロードさせると、この例外が引き続き発生します。

于 2013-02-28T16:14:58.677 に答える