Primefaces requiredMessage nur an einer Stelle anzeigen

Hallo zusammen,

ich habe eine WebAnwendung die JSF 2.2 (MyFaces 2.2.6) und PrimeFaces 5.0 nutzt. Die Webseiten werden mit einem Template erstellt, das den Header, die Navigation und die Growl-Seite einbindet.

growl.xhtml sieht so aus.

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:f="http://java.sun.com/jsf/core" 
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:p="http://primefaces.org/ui">
<ui:composition>
    <h:form id="growl" prependId="false">
        <p:growl showDetail="true" showSummary="false" sticky="true" severity="fatal" />
        <p:growl showDetail="true" showSummary="false" sticky="true" severity="error" />
        <p:growl showDetail="true" showSummary="false" sticky="true" severity="info" />
        <p:growl showDetail="true" showSummary="false" sticky="true" severity="warn" />
    </h:form>
</ui:composition>
</html>

Dieses Layout-Template wird auch auf der WelcomePage verwendet, hier gibt es ein Login-Formular mit jeweils einer RequiredMessage an den Input-Feldern dran und einer Messages-Componente um diese anzuzeigen.

Das Problem ist jetzt, das die RequiredMessages sowohl mit der Messages-Componente angezeigt aber auch mit dem Growl. Ich möchte aber gerne, das diese nicht im Growl dargestellt wird.

WelcomePage.xhtml - Login-Formular

<h:form id="formLogin" enctype="multipart/form-data" styleClass="form-horizontal" prependId="false">
    <div class="form-group">
        <div class="col-sm-12">
            <h:inputText id="j_username" size="30" value="#{loginController.username}" required="true" requiredMessage="Bitte Nutzerkennung eingeben." pt:placeholder="Benutzername"/>
        </div>
    </div>

    <div class="form-group">
        <div class="col-sm-12">
            <h:inputSecret id="j_password" size="30" value="#{loginController.password}" required="true" requiredMessage="Bitte Passwort eingeben." pt:placeholder="Kennwort"/>
        </div>
    </div>

    <div class="form-group">
        <div class="col-sm-12">
            <p:messages showDetail="true" showSummary="false" autoUpdate="false"/>
        </div>
    </div>
	<div class="form-group">
        <div class="col-sm-12">
            <h:commandButton id="btnlogin" value="Login" action="#{loginController.login}" disabled="#{loginController.mode eq 'error'}" type="submit" />
        </div>
    </div>
</h:form>

Ich hab schon in der growl.xhtml bei error globalOnly="true" eingesetzt. Das hat zwar den gewünschten Erfolg gebracht, allerdings habe ich die Befürchtung das dadurch andere Messages verschwinden, die eigentlich angezeigt werden sollen.

Gibt es vielleicht einen anderen Weg den gewünschten Effekt zu erhalten?

Es kommt darauf an, was Du anzeigen möchtest. Für generelle Fehler ist globalOnly eigentlich genau das richtige Attribut. Alle anderen Fehler (mit client id) sollten entsprechend an der zuständigen Komponente auftauchen.

Andere Lösungen (z.B. über das rendered-Attribute) würde ich hier nicht empfehlen.

Am liebsten wäe mir, wenn die RequiredMessages nicht als error sondern als eigene Gewichtung verarbeitet werden würde, dann würde das Growl überhaupt nicht reagieren. Aber eine eigene Compente dafür zuschreiben ist dann auch wieder etwas übertrieben.

Ich werde wohl doch mit dem globalOnly arbeiten und die jeweiligen Stellen entsprechend Anpassen, diese Arbeit hätte ich mir nur gerne erspart.

*** Edit ***

Ich hab das Problem jetzt gelöst und das doch auf relativ einfach Art.

an den einzelnen Growls hab ich ein redisplay="false" dran gehängt und im Template die Reihenfolge der Includes angepasst. Jetzt wird erst der Content eingefügt und dann erst die growl.xhtml.

Jetzt werden im Growl nur noch Messages angezeigt, die noch nicht auf der dargestellten Seite zu finden sind.

growl.xhtml sieht jetzt so aus:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:f="http://java.sun.com/jsf/core" 
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:p="http://primefaces.org/ui">
<ui:composition>
    <h:form id="growl" prependId="false">
        <p:growl showDetail="true" showSummary="false" sticky="true" severity="fatal" />
        <p:growl showDetail="true" showSummary="false" sticky="true" severity="error" redisplay="false"/>
        <p:growl showDetail="true" showSummary="false" sticky="true" severity="info" redisplay="false"/>
        <p:growl showDetail="true" showSummary="false" sticky="true" severity="warn" redisplay="false"/>
    </h:form>
</ui:composition>
</html>

template.xhtml:

	<h:body>
        <ui:include src="header.xhtml" />
        <ui:include src="navigation.xhtml" />
        <ui:insert name="content" />
        <ui:include src="growl.xhtml" />
	</h:body>