在liferay中跨portlet发送自定义对象

时间:2013-02-28 15:05:38

标签: liferay classloader portlet liferay-6

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

1 个答案:

答案 0 :(得分:4)

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

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