JSF Flash Scope recuerda demasiados mensajes
jsf-2 primefaces (1)
Tengo un flujo simple en mi aplicación: si completa y presiona guardar en un formulario (si todo va bien), se le redirige a una segunda vista con una lista. Ahora quería agregar un mensaje que decía "Has añadido un objeto con éxito", pero dado que estoy usando un redireccionamiento de lo que recuerdo, necesito usar el alcance de Flash. Y así lo hice. El problema es que durante el primer "guardar", muestra correctamente solo 1 mensaje, pero cuando vuelvo al formulario y presiono "guardar", ¡me mostrará el mensaje actual y el anterior! Es aún más extraño que cuando (por tercera vez) vuelvo al formulario y presiono "guardar" nuevamente obtengo solo 1 mensaje (y así sucesivamente en 1-2-1-2-1-2 etc.). ¿Estoy haciendo algo mal o es un error en jsf? Quiero decir que estoy llamando al mismo método y obtengo resultados diferentes ...
Estoy usando Primefaces y el nuevo mojarr:
jsf-api-2.1.1-b04
jsf-impl-2.1.1-b04
Primefaces-2.2.1
Aquí está el código (al menos las partes más relevantes):
SaveForm.xhtml:
<div id="content-box" class="content-box">
<p:panel id="content-panel" header="Dane raportu"
styleClass="content-panel">
<div class="content-box">
<h:form prependId="false">
<h:panelGrid id="grid" columns="2" styleClass="content-panel">
<!-- some inputs and labels -->
<p:commandButton value="#{msg[''thesis.save.button'']}"
action="#{thesisBean.saveThesis}" />
</h:panelGrid>
</h:form>
</div>
</p:panel>
</div>
método saveThesis:
public String saveThesis() {
//this creates a Hibernate entity and saves it to the DB
thesisService.addThesis(createThesisEntity());
FacesContext context = FacesContext.getCurrentInstance();
context.getExternalContext().getFlash().setKeepMessages(true);
ResourceBundle bundle = context.getApplication().getResourceBundle(
context, "msg");
context.addMessage(null,
new FacesMessage(FacesMessage.SEVERITY_INFO, "key1",
"key2"));
return "list-theses.xhtml?faces-redirect=true";
}
list-theses.xhtml:
<ui:composition template="/basicTemplate.xhtml">
<ui:define name="content">
<p:growl id="growl" showDetail="true" sticky="false" life="5000" />
<div id="content-box" class="content-box">
<h:form prependId="false" id="table-form">
<p:dataTable var="thesis" value="#{thesisTableBean.theses}"
paginator="true" rows="20">
<p:column styleClass="table-name-column">
<f:facet name="header">
<h:outputText value="#{msg[''thesis.table.name.header'']}" />
</f:facet>
<h:outputText value="#{thesis.firstName} #{thesis.lastName}" />
</p:column>
<p:column>
<f:facet name="header">
<h:outputText value="#{msg[''thesis.table.title.header'']}" />
</f:facet>
<h:outputText value="${thesis.title}" />
</p:column>
<p:column styleClass="table-number-column">
<f:facet name="header">
<h:outputText value="#{msg[''thesis.table.number.header'']}" />
</f:facet>
<h:outputText value="${thesis.number}" />
</p:column>
</p:dataTable>
</h:form>
</div>
</ui:define>
Bueno, encontré una "solución" aquí: http://ocpsoft.com/java/persist-and-pass-facesmessages-over-page-redirects/ Parece que funciona bastante bien. Aún no tengo idea de por qué mi código no funciona. Quiero decir que es el mismo método cada vez pero el resultado difiere ...