actionResponse.sendRedirect (url) не работает - PullRequest
0 голосов
/ 04 августа 2011

У меня есть один портлет, который имеет команду Link.В actionListner для commandLink я вызвал backingBean.

Поддерживающий компонент имеет следующий код:

ActionResponse actionResponse = (ActionResponse) LiferayFacesContext.getInstance().
     getExternalContext().getResponse();
actionResponse.sendRedirect("http://localhost:8080/web/guest/pageName");

У меня перенаправление на другую страницу портлета.Оба портлета содержатся в одной войне.

Это перенаправление не работает, оно дает: 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

Exception StackTrace:

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.invokel.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.javax.face.java:3).UICommand.broadcast (UICommand.java:296) на сайте javax.faces.component.UIViewRoot.broadcastEvents (UIViewRoot.java:781) на сайте javax.faces.component.UIViewRoot.processApplication (UIViewRoot.java:1246) в com.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.GenericFacesPortlet.serveResource (Generi)cFacesPortlet.java:131) в com.liferay.portlet.FilterChainImpl.doFilter (FilterChainImpl.java:119) в com.liferay.portal.kernel.portlet.PortletFilterUtil.doFilter (PortletFilterUtil.javarayal.port.javaray: at). com.kernel.servlet.PortletServlet.service (PortletServlet.java:92) в javax.servlet.http.HttpServlet.service (HttpServlet.java:717) в org.apache.catalina.core.ApplicationFilterChain.internalFilter (2) в org.apache.catalina.core.ApplicationFilterChain.doFilter (ApplicationFilterChain.java:206)

ПРИМЕЧАНИЕ : я использую Liferay & Icefaces.

Спасибо.

Ответы [ 2 ]

1 голос
/ 20 октября 2011

Пожалуйста, попробуйте эту ссылку,

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" />

в вашем бобе,

 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();
         }
      }

Я тоже столкнулся с этой проблемой.Использовал вышеуказанное решение, но не работал.Позже выяснилось, что это проблема с фреймом portrayfaces-bridge.Я действительно использовал portletfaces-bridge-2.0.0.jar, но эта проблема была решена в portletfaces-bridge-2.0.1.jar.

Попробуйте использовать portletfaces-bridge-2.0.1.jar.и приведенный выше код будет работать.

Если это не работает для вас.Затем проверьте, используете ли вы GenericFacesportlet.В этом случае вы должны использовать Liferay 6.0.6.

1 голос
/ 05 августа 2011

Раньше у меня была похожая проблема с использованием actionResponse.sendRedirect () в моей последней работе над проектами с Spring и Liferay, хотя Spring дал мне более четкое исключение

Set render parameter has already been called.

Этот метод actionReponse.sendRedirect () довольно ограничен в течение жизненного цикла портлета. в соответствии с API-интерфейсом портлета он не может быть вызван после вызова любого из следующих методов интерфейса ActionResponse:

  • setPortletMode
  • setWindowState
  • setRenderParameter
  • setRenderParameters
  • removePublicRenderParamter

Вполне вероятно, что ваша инфраструктура портлетов установит PortletMode и RenderParameter в какой-то момент перед тем, как вы начнете кодировать. Я знаю, что Spring делает это, когда объявляет бины, связанные с портлетами, в контексте (хотя оригинальная идея состоит в том, чтобы сделать жизнь разработчика проще с помощью DI). Если вы не можете это исправить в существующей инфраструктуре инфраструктуры портлетов. Возможное решение - написать свой собственный javax.portlet.filter, проверить имя действия и правильно вызвать sendRedirect ().

...