com.liferay.portlet.ActionResponseImpl无法强制转换为com.liferay.portlet.ActionResponseImpl

时间:2012-10-26 10:26:59

标签: java casting liferay

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

 private void mappingMethod(ActionResponse response) {

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

在“Expression Evaluation”窗口的调试中,我可以看到“responce”的类型是ActionResponseImpl,而cast不会导致异常。但是在运行时我有这个例子:

  

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

请告诉我这是什么问题。

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

4 个答案:

答案 0 :(得分:3)

如果你在自定义插件portlet中没有使用portal-impl.jar中的类,那对你有好处。

ActionResponseImplportal-impl.jar中的一个类。因此,如果您可以提供一个用例,说明您计划使用此类的原因,那么我们可以建议替代方案。

答案 1 :(得分:1)

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

ClassCastException想要告诉你的是你的类扩展了ActionResponseImpl的一个实现,但是运行时环境期望它是另一个实现 - 它们可能是相同的,但是当它们从两个不同的源加载时,类加载器不能引用一个到另一个超类而不是它延伸。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

了解详情:http://www.javaspecialists.eu/archive/Issue018.html