Omnifaces Faces.redirect теряет сферу общения

У меня проблема с org.omnifaces.util.Faces# редиректом и бобом области видимости:

есть кнопка

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

который должен выполнить навигацию, чтобы создать страницу Car в пределах той же области диалога после инициализации моего bean-объекта области видимости: createHandler.

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

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

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

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

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

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

Спасибо!

1 ответ

Решение

Распространение диалога обрабатывается обработчиком навигации. Faces#redirect() делегаты ExternalContext#redirect() который не использует обработчик навигации. Вы бы лучше использовать Faces#navigate() вместо этого, который делегирует NavigationHandler#handleNavigation(),

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,

Другие вопросы по тегам