2

我在尝试在liferay 中的portlet 之间发送共享自定义对象时遇到了严重问题。我有一个带有 servlet 过滤器的 Hook 插件,它加载 MyCustomClass 类型的对象并将其作为参数插入到请求对象中。

当我尝试在 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

1 回答 1

4

听起来您看到的主要问题是两个不同的类加载器正在加载从技术上使它们成为不同类的类(看起来您已经确定了)。

我没有太多使用 LifeRay,但这也是我在其他平台上看到的一个问题。我们使用 WebSphere 并通过将公共 MyCustomClass 放入服务器类路径上的共享库中解决了这个问题。这样,服务器将加载该类并通过服务器的单个类加载器使其对服务器上的所有应用程序可用。如果您让每个应用程序加载该类,那么您将继续看到此异常。

于 2013-02-28T16:14:58.677 回答