我试图像这样投射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方法具有相同的字符串,但这里它正在工作....
答案 0 :(得分:3)
如果你在自定义插件portlet中没有使用portal-impl.jar
中的类,那对你有好处。
ActionResponseImpl
是portal-impl.jar
中的一个类。因此,如果您可以提供一个用例,说明您计划使用此类的原因,那么我们可以建议替代方案。
答案 1 :(得分:1)
你在类路径上有两次ActionResponseImpl - 你在项目中包含Liferay的罐子吗?正如Prakash所提到的,它是portal-impl.jar,你在插件中不能拥有。
ClassCastException想要告诉你的是你的类扩展了ActionResponseImpl的一个实现,但是运行时环境期望它是另一个实现 - 它们可能是相同的,但是当它们从两个不同的源加载时,类加载器不能引用一个到另一个超类而不是它延伸。
答案 2 :(得分:0)
当我从XHTML页面调用使用Ajax的方法时,我看到了这个问题。我修改了我的方法以返回简单的字符串并删除了试图修改actionResponseImpl并解决了问题的代码。
答案 3 :(得分:0)
这种类型的错误是由不同的类加载器产生的。类由其完全限定的类名及其类加载器标识。所以如果你在你的portlet中嵌入了portal-impl;该操作将从门户类加载器接收ActionResponseImpl实例,并尝试将此实例转换为portlet类加载器的类。