Java actionResponse.sendRedirect(url)不工作

Java actionResponse.sendRedirect(url)不工作,java,liferay,portlet,icefaces,Java,Liferay,Portlet,Icefaces,我有一个portlet,它有一个commandLink。在commandLink的actionListner上,我调用了backingBean 支持bean具有以下代码 ActionResponse actionResponse = (ActionResponse) LiferayFacesContext.getInstance(). getExternalContext().getResponse(); actionResponse.sendRedirect("http://loca

我有一个portlet,它有一个commandLink。在commandLink的actionListner上,我调用了backingBean

支持bean具有以下代码

ActionResponse actionResponse = (ActionResponse) LiferayFacesContext.getInstance().
     getExternalContext().getResponse();
actionResponse.sendRedirect("http://localhost:8080/web/guest/pageName");
我重定向到另一个portlet页面。这两个portlet都包含在一个war中

此重定向不起作用,它提供:
classCastException。无法拆分为ActionResponse

我也试过,

ActionResponse actionResponse= (ActionResponse) FacesContext.getCurrentInstance().
    getExternalContext().getResponse();
actionResponse.sendRedirect("http://localhost:8080/web/guest/pageName");
它抛出
ClassCastException。无法强制转换为ActionResponse

异常堆栈跟踪:

java.lang.ClassCastException:com.liferay.portlet.ResourceResponseImpl无法转换为javax.portlet.ActionResponse 在com.brightsky.action.IPCActionBackingBean.addIPCAction(IPCActionBackingBean.java:63)上 在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处 位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)中 位于java.lang.reflect.Method.invoke(Method.java:597) 位于org.jboss.el.util.ReflectionUtil.invokeMethod(ReflectionUtil.java:328) 位于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) 位于org.jboss.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:276) 在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) 位于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)上 位于org.portletfaces.bridge.genericfacesortlet.serversource(genericfacesortlet.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


谢谢。

在我上一次与Spring和Liferay合作的项目中,我使用actionResponse.sendRedirect()时也遇到过类似的问题,不过Spring给了我一个更明确的例外

Set render参数已被调用。

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

  • setPortletMode
  • 设置窗口状态
  • setRenderParameter
  • setRenderParameters
  • RemovePublicRenderParameter
您的portlet框架很可能在编写代码之前的某个时刻设置了PortletMode和RenderParameter。我知道Spring在上下文中声明与portlet相关的bean时会这样做(尽管最初的想法是通过DI使开发人员的生活更加轻松)。如果您无法在现有的portlet框架基础设施中修复此问题。一种可能的解决方案是编写自己的javax.portlet.filter,检查操作名称,并正确调用sendRedirect()

请尝试此链接

和代码

在jsp或xhtml中

<h:commandButton id="btn1" type="submit" action="#{bean.redirectAction}" value="test redirect ajax" />

在你的豆子里

 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();
         }
      }
public void重定向操作(){
System.out.println(“动作触发”);
试一试{
Map-RequestMap=FacesContext.getCurrentInstance().getExternalContext().getRequestMap();
主题显示主题显示=(主题显示)RequestMap.get(“主题显示”);
FacesContext.getCurrentInstance().getExternalContext().redirect(主题显示.getPortalURL()+“/web/{user id}/home”);
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
我也面临着这个问题。使用了上述解决方案,但不起作用。 后来发现,这是liferay的portletfaces桥jar的问题。 我实际上使用的是portletfaces-bridge-2.0.0.jar,但这个问题在portletfaces-bridge-2.0.1.jar中得到了解决

尝试使用portletfaces-bridge-2.0.1.jar。上面的代码将起作用


如果这对你不起作用。然后,检查您是否正在使用GenericFacesportlet。在这种情况下,您必须使用Liferay 6.0.6。

您好,谢谢您的回复。实际上,我在这一行得到了类强制转换异常ActionResponse ActionResponse=(ActionResponse)FacesContext.getCurrentInstance().getExternalContext().getResponse();它给出了,不能转换为ActionResponse。如果我做了像FacesContext.getCurrentInstance().getExternalContext().redirect(url)这样的事情;FacesContext.getCurrentInstance().responseComplete();它给出了java.io.UnsupportedEncodingException:只能在操作阶段重定向异常表示它实际上是一个ResourceResponse,请检查您提出此请求的查看页面,确保您使用的是正确的请求,而不是