Omnifaces Faces.redirect теряет размах разговора

У меня проблема с org.omnifaces.util.Faces # redirect и bean-компонентом с областью диалога:

есть кнопка

<p:commandButton action="#{navigationHandler.gotoCreateCar}"
  actionListener="#{createHandler.init(searchHandler.search())}
  value="#{msg.search}" update=":articleSearchForm">
  <f:param name="cid" value="#{javax.enterprise.context.conversation.id}"/>
</p:commandButton>

который должен выполнять навигацию по странице createCar в той же области диалога после инициализации моего bean-компонента с областью диалога: createHandler.

В NavigationHandler # gotoCreateCar - это просто вызов Faces.redirect (createCarPage).

Если мне это нравится, параметр cid не передается, и я теряю разговор.

Если я определю правило навигации в faces-config.xml:

<navigation-case>
  <from-outcome>createCar</from-outcome>
  <to-view-id>/portal/createCar.xhtml</to-view-id>
  <redirect />
</navigation-case>

а в NavigationHandler # gotoCreateCar просто верните нужный результат - тогда все будет нормально.

Возможно, я не понимаю всех деталей разницы между этими двумя подходами к навигации. Я был бы признателен, если бы кто-нибудь помог мне разобраться в проблеме.

Спасибо!


person golinko    schedule 17.06.2014    source источник


Ответы (1)


Распространение диалога обрабатывается обработчиком навигации. _ 1_ делегирует _ 2_, которая не использует обработчик навигации. Лучше использовать Faces#navigate() вместо этого делегирует _ 4_.

public void gotoCreateCar() {
    // ...

    Faces.navigate("/portal/createCar.xhtml?faces-redirect=true");
}

(примечание: в этом случае <navigation-case> не требуется)

Или просто верните именно эту строку из метода действия.

public String gotoCreateCar() {
    // ...

    return "/portal/createCar.xhtml?faces-redirect=true";
}    

Faces#navigate() полезен только тогда, когда вы находитесь внутри метода (слушателя), который не поддерживает возврат результата варианта навигации, например @PostConstruct или preRenderView.

person BalusC    schedule 17.06.2014
comment
Хорошо спасибо! Можете ли вы также объяснить, в чем разница между перенаправлением ExternalContext # и перенаправлением обработчика навигации? - person golinko; 17.06.2014
comment
Один не использует обработчик навигации JSF, а другой использует. - person BalusC; 17.06.2014
comment
Итак, обработчик навигации обрабатывает диалог в дополнение к перенаправлению, а ExternalContext просто выполняет перенаправление? Извините, я просто пытаюсь прояснить для себя вопрос. - person golinko; 17.06.2014
comment
да. Как уже было сказано, распространение диалога обрабатывается обработчиком навигации JSF. ExternalContext#redirect() не использует обработчик навигации JSF. Он просто устанавливает простой заголовок HTTP Location в ответ без каких-либо манипуляций с заданным путем. Обработчик навигации JSF поддерживает более детальный контроль над этим, например он может интерпретировать данный путь как (относительный) идентификатор представления JSF и выполнять некоторые дополнительные действия на основе, например, текущее состояние разговора или дополнительные конкретные параметры, такие как faces-redirect, includeViewParams и т. д. - person BalusC; 17.06.2014
comment
Обратите внимание, что голубоватые тексты в моем ответе на самом деле являются ссылками на документы (как обычно). Щелкните их, чтобы просмотреть и прочитать документы. Это также объясняется там. - person BalusC; 17.06.2014
comment
Большое Вам спасибо. Я должен прочитать исходный код, чтобы увидеть все детали :) и документацию также ... - person golinko; 17.06.2014