actionResponse.sendRedirect(url)无效

时间:2011-08-04 06:27:51

标签: java liferay portlet icefaces

我有一个有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的。

谢谢。

2 个答案:

答案 0 :(得分:1)

我曾经在使用Spring和Liferay的上一个项目中使用actionResponse.sendRedirect()时有类似的问题,虽然Spring给了我一个更明确的异常

Set render parameter has already been called.

此方法actionReponse.sendRedirect()在portlet生命周期中受到很大限制。根据{{​​3}},在调用ActionResponse接口的以下任何方法后,无法调用它:

  • setPortletMode
  • setWindowState
  • setRenderParameter
  • setRenderParameters
  • removePublicRenderParamter

您的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。