Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Object in Flash scope is not available after redirect

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

like image 749
Kiva Avatar asked Feb 05 '12 11:02

Kiva


2 Answers

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.

like image 100
BalusC Avatar answered Nov 15 '22 01:11

BalusC


jsf 2.1 with netbeans has this problem with flash. using /somepage?redirect-faces=true or /somedirectory/somepage?faces-redirect=true does not work. it has to be somepage?redirect-faces=true.

tested mojarra 2.1.7, but it didn't have the above problem.

like image 21
glofalcon Avatar answered Nov 15 '22 00:11

glofalcon