-2

我试图像这样投射 Action 响应:

 private void mappingMethod(ActionResponse response) {

        ActionResponseImpl actionResponseImpl = (ActionResponseImpl)response;
...}

在“表达式评估”窗口的调试中,我可以看到“响应”的类型是 ActionResponseImpl,并且强制转换不会导致异常。但是在运行时我有这个例外:

java.lang.ClassCastException:com.liferay.portlet.ActionResponseImpl 无法转换为 com.liferay.portlet.ActionResponseImpl

请告诉我有什么问题。

PS:在 PortalImpl 类中,copyRequestParameters 方法具有相同的字符串,但在这里它正在工作......

4

4 回答 4

3

如果您避免使用portal-impl.jar自定义插件 portlet 中的类,这对您有好处。

ActionResponseImpl是中的一个类portal-impl.jar。因此,如果您可以给出一个用例说明您为什么打算使用这个类,那么我们可以建议替代方案。

于 2012-10-26T10:57:35.463 回答
1

您在类路径上有两次 ActionResponseImpl - Liferay 的哪些 jars 包含在您的项目中?正如 Prakash 提到的,它是 portal-impl.jar,你不能在插件中拥有它。

ClassCastException 想要告诉您的是,您的类扩展了 ActionResponseImpl 的一个实现,但运行时环境期望它是另一个实现 - 它们可能是相同的,但是由于它们是从两个不同的源加载的,因此类加载器不能引用另一个超类比它扩展。

于 2012-10-26T12:24:04.750 回答
0

当我从 XHTML 页面调用使用 Ajax 的方法时,我看到了这个问题。我修改了我的方法以返回简单的字符串,并删除了试图修改 actionResponseImpl 并解决问题的代码。

于 2012-10-26T13:15:54.117 回答
0

这种类型的错误是由不同的类加载器产生的。一个类由其完全限定的类名及其类加载器标识。因此,如果您在 portlet 中嵌入了 portal-impl;该操作将从门户类加载器接收一个 ActionResponseImpl 实例,并试图将其转换为您的 portlet 类加载器的一个类。

查看更多:http ://www.javaspecialists.eu/archive/Issue018.html

于 2017-07-07T13:00:46.233 回答