Object in Flash scope is not available after redirect

Kiva picture Kiva · Feb 5, 2012 · Viewed 8.2k times · Source

I have a misunderstanding with the use of flash scope in jsf 2. I want to put an object in flash map during my action and show this object in the next page. Here is my action (call by h:commandLink):

public String showDetail(PersonneDTO personne) {
    MessageFlashBean message = new MessageFlashBean();
    message.addMessage("test");
    FacesContext.getCurrentInstance().getExternalContext().getFlash()
        .put("test", message);
    return "showDetail";
}

It's just a test, but the real object I want to use is more complex.

Here is the second page with the flash use:

<ui:fragment rendered="#{flash.test != null and flash.test.hasMessage()}" >
    <ui:repeat var="message" value="#{flash.test.messages}">
        #{message}
    </ui:repeat>
</ui:fragment>

Here is the navigation (and here is my problem :) ):

<navigation-rule>
    <from-view-id>/index.xhtml</from-view-id>
    <navigation-case>
        <from-outcome>showDetail</from-outcome>
        <to-view-id>/private/showDetail.xhtml</to-view-id>
    </navigation-case>
</navigation-rule>

In this case, the flash scope works fine and my message appears.

But if I add a redirect in the navigation case, my object in the flash map has disappeared.

I don't understand why I can't use redirect in the navigation rule (I believed it was the goal of flash scope).

May be something is wrong in my code.

Someone can help me ?

Thanks

Answer

BalusC picture BalusC · Feb 6, 2012

The Mojarra's implementation of the JSF2 Flash scope had a lot of problems. Most of them were resolved with every new Mojarra release. Currently, with the latest Mojarra version, the 2.1.6, there's as far as I know still only one major open problem: it won't work if you redirect to a different base path. See also the (currently) last comment in the long discussion in issue 1751.

Right now, you have basically the following options:

  1. Forget using Flash when you need to redirect to a different base path. Use a request parameter instead or try to simulate the flash scope with a custom cookie.

  2. If possible, reorganize the folder structure so that you don't need to redirect to a different base path when you need the flash scope to survive.

  3. Try MyFaces instead of Mojarra. Maybe it does it better with regard to flash scope.


Update: as per issue 2136, the last open problem of Flash scope not being available after a redirect on a different path is solved in the shortly upcoming Mojarra 2.1.14. So with this version, all Flash scope related problems discovered and open so far should be solved and closed.