我有一个有commandLink的portlet。在commandLink的actionListner上,我调用了backingBean。
支持bean具有以下代码。
ActionResponse actionResponse = (ActionResponse) LiferayFacesContext.getInstance().
getExternalContext().getResponse();
actionResponse.sendRedirect("http://localhost:8080/web/guest/pageName");
我有一个重定向到另一个portlet页面。这两个portlet都包含在一场战争中。
此重定向无效,它给出:
classCastException. can't clast to ActionResponse
我也试过了,
ActionResponse actionResponse= (ActionResponse) FacesContext.getCurrentInstance().
getExternalContext().getResponse();
actionResponse.sendRedirect("http://localhost:8080/web/guest/pageName");
它引发ClassCastException. Can not cast to ActionResponse
异常StackTrace:
java.lang.ClassCastException:com.liferay.portlet.ResourceResponseImpl无法强制转换为javax.portlet.ActionResponse 在com.brightsky.action.IPCActionBackingBean.addIPCAction(IPCActionBackingBean.java:63) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 在java.lang.reflect.Method.invoke(Method.java:597) 在org.jboss.el.util.ReflectionUtil.invokeMethod(ReflectionUtil.java:328) at org.jboss.el.util.ReflectionUtil.invokeMethod(ReflectionUtil.java:341) 在org.jboss.el.parser.AstPropertySuffix.invoke(AstPropertySuffix.java:58) 在org.jboss.el.parser.AstValue.invoke(AstValue.java:96) at org.jboss.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:276) at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:102) 在javax.faces.event.MethodExpressionActionListener.processAction(MethodExpressionActionListener.java:144) 在javax.faces.event.ActionEvent.processListener(ActionEvent.java:84) 在javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:773) 在javax.faces.component.UICommand.broadcast(UICommand.java:296) 在javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:781) 在javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1246) at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:77) 在com.sun.faces.lifecycle.Phase.doPhase(Phase.java:97) 在com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:114) 在org.portletfaces.bridge.BridgeImpl.doFacesRequest(BridgeImpl.java:513) at org.portletfaces.bridge.GenericFacesPortlet.serveResource(GenericFacesPortlet.java:131) 在com.liferay.portlet.FilterChainImpl.doFilter(FilterChainImpl.java:119) 在com.liferay.portal.kernel.portlet.PortletFilterUtil.doFilter(PortletFilterUtil.java:71) 在com.liferay.portal.kernel.servlet.PortletServlet.service(PortletServlet.java:92) 在javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
注意:我正在使用Liferay& ICEfaces的。
谢谢。
答案 0 :(得分:1)
我曾经在使用Spring和Liferay的上一个项目中使用actionResponse.sendRedirect()时有类似的问题,虽然Spring给了我一个更明确的异常
Set render parameter has already been called.
此方法actionReponse.sendRedirect()在portlet生命周期中受到很大限制。根据{{3}},在调用ActionResponse接口的以下任何方法后,无法调用它:
您的portlet框架很可能在编码之前的某个时刻设置了PortletMode和RenderParameter。我知道Spring在上下文中声明与portlet相关的bean时会这样做(尽管最初的想法是通过DI使开发人员的生活更轻松)。如果您无法在现有的portlet框架基础结构中修复此问题。一个可能的解决方案是编写自己的javax.portlet.filter,检查操作名称,并正确调用sendRedirect()。
答案 1 :(得分:1)
请尝试此链接,
http://www.portletfaces.org/community/forums/-/message_boards/view_message/76606
和代码,
在你的jsp或xhtml中,
<h:commandButton id="btn1" type="submit" action="#{bean.redirectAction}" value="test redirect ajax" />
在你的bean中,
public void redirectAction() {
System.out.println("Action Triggrered");
try {
Map<String, Object> reqestMap = FacesContext.getCurrentInstance().getExternalContext().getRequestMap();
ThemeDisplay themeDisplay = (ThemeDisplay) reqestMap.get("THEME_DISPLAY");
FacesContext.getCurrentInstance().getExternalContext().redirect(themeDisplay.getPortalURL() + "/web/{user-id}/home");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
我也遇到了这个问题。使用上述解决方案,但无法正常工作。 后来发现,这是liferay的portletfaces-bridge jar的问题。 我实际上使用的是portletfaces-bridge-2.0.0.jar,但是这个问题在portletfaces-bridge-2.0.1.jar中得到了解决。
尝试使用portletfaces-bridge-2.0.1.jar。以上代码将起作用。
如果这不适合你。然后,检查您是否使用GenericFacesportlet。在这种情况下,您必须使用Liferay 6.0.6。