JSF 2.1 Перенаправление на портлет

Я обновил свой Liferay до 6.0 и JSF с 1.2 до 2.1. Мой существующий код

 ((ActionResponse)context.getExternalContext().getResponse()).sendRedirect( redirect );
context.responseComplete();

Здесь перенаправление определяется следующим образом:

String redirect = "/namingportal/group/customercenter/accountSearch";

Приведенный выше URL-адрес — это страница портлета, на которую должен быть перенаправлен запрос.

Начал ломаться с ошибкой: java.lang.IllegalStateException: Set параметр рендеринга уже был вызван в com.liferay.portlet.ActionResponseImpl.sendRedirect(ActionResponseImpl.java:48)

Погуглив немного, я решил, что приведенный выше код следует заменить следующим:

Решение 1:

context.getExternalContext().redirect(redirect);

Когда я попытался с Решением 1, это дало мне ошибку FacesFileNotFound /namingportal/group/customercenter/accountSearch.xhtml, на самом деле он ищет xhtml, а не портлет.

У меня также есть это в моем web.xml:

<context-param>
        <param-name>javax.faces.DEFAULT_SUFFIX</param-name>
        <param-value>.xhtml</param-value>
    </context-param>

Сообщите мне, есть ли другой альтернативный способ перенаправления на портлет из метода управляемого компонента JSF с использованием Liferay 6.0 и JSF 2.1.

Спасибо


person Sri    schedule 28.06.2012    source источник
comment
Какой URL-адрес этой страницы, когда вы открываете ее непосредственно в веб-браузере? т.е. что вы видите в адресной строке браузера, когда эта страница якобы корректно запрашивается?   -  person BalusC    schedule 28.06.2012
comment
Вот правильный URL-адрес, который должен перенаправлять управляемый компонент: https://‹host-name›:‹port›/namingportal/group/customercenter/accountSearch. Когда я набираю этот URL-адрес непосредственно в браузере, портлет отображается правильно.   -  person Sri    schedule 28.06.2012
comment
Ах хорошо. Это будет специфично для портлета.   -  person BalusC    schedule 28.06.2012
comment
Да, я пытался ввести/вставить URL-адрес прямо в адресную строку браузера.   -  person Sri    schedule 28.06.2012


Ответы (1)


Мост соответствует требованиям спецификации JSR 329 для ExternalContext.redirect(String), что обеспечивает стандартный способ достижения того, что вы хотите сделать.

В большинстве случаев ExternalContext.redirect(String) рассматривается мостом как часть срабатывания правила навигации JSF. Однако есть два способа заставить его работать в вашем случае:

1) Добавьте в URL-адрес параметр Bridge.DIRECT_LINK со значением «true»:

String redirect = "/namingportal/group/customercenter/accountSearch?javax.portlet.faces.DirectLink=true";
externalContext.redirect(redirect);

2) Сделайте URL-адрес абсолютным, например:

PortletRequest portletRequest = externalContext.getRequest();
ThemeDisplay themeDisplay = (ThemeDisplay) portletRequest.getAttribute("THEME_DISPLAY");
String portalURL = themeDisplay.getPortalURL();
String redirect = portalURL + "/namingportal/group/customercenter/accountSearch";
externalContext.redirect(redirect);
person Sri    schedule 06.07.2012