web-dev-qa-db-de.com

Die Formularkomponente muss eine UIForm in ihrer Herkunft haben. Vorschlag: Fügen Sie die erforderlichen Komponenten in <h: form> ein

Hier ist mein Formular:

<form action="j_security_check">
    <h:panelGrid columns="2" bgcolor="#eff5fa" cellspacing="5" frame="box" styleClass="center">
        <h:outputLabel value="User ID:"/>
        <h:inputText id="j_username" tabindex="1" />
        <h:outputLabel value="Password:"/>
        <h:inputSecret id="j_password"/>
        <h:outputLabel value=""/>
        <h:commandButton id="login" value="Login"/>
    </h:panelGrid>
</form>

Es funktioniert gut mit Glassfish 3.0.1, aber seit Glassfish 3.1 b2 wird diese Warnung auf der JSF-Seite als FacesMessage angezeigt:

Die Formularkomponente muss eine UIForm in ihrer Herkunft haben. Vorschlag: Fügen Sie die erforderlichen Komponenten in <h:form> Ein.

Wenn ich den <form action="j_security_check"> In <h:form> Ändere, wird dies nicht behoben. Ich muss den <h:form> In den <h:panelGrid> Einfügen.

38
Thang Pham

Dies ist nur ein Warnung kein Fehler. Warnungen informieren den Entwickler in der Regel über unvorhergesehene Situationen/Bedingungen, die möglicherweise nicht sofort zu technischen Fehlern/Problemen führen. Alles funktioniert möglicherweise einwandfrei, aber das Verhalten/die Ergebnisse entsprechen möglicherweise nicht den Absichten des Entwicklers. Ein Neuling Entwickler kann zum Beispiel versehentlich <form> Anstatt von <h:form>. Warnungen wie diese sind dann hilfreich.

In Ihrem speziellen Fall müssen Sie einfach <form> wegen der Notwendigkeit, sich an einen Nicht-JSF-Service zu wenden. Sie als erfahrener Entwickler wissen, dass dies legitim ist. Sie können diese Warnung einfach ignorieren. Diese Warnung wird nur angezeigt, wenn javax.faces.PROJECT_STAGE ist ohnehin auf Development gesetzt und not erscheint, wenn es auf Production gesetzt ist.

Es ist jedoch ein Fehler für mich, dass die Warnung weiterhin angezeigt wird, wenn sich zwischen dem Formular und seinen untergeordneten Elementen eine andere Komponente wie z. B. ein Panelgrid befindet. Ich würde es den Mojarra-Leuten melden. Es sieht so aus, als würde nur der unmittelbare Elternteil überprüft und nicht alle Eltern. Update : Es wurde gemäß Mojarra 2.1.3/2.2 behoben, siehe auch Ausgabe 2147 .

Dies ist übrigens nicht Glassfish-spezifisch. Die neuere GF Version wird natürlich mit einer neueren Mojarra-Version ausgeliefert, in der diese Warnungen implementiert sind. Siehe auch Ausgabe 166 .

Verwandte Fragen:

47
BalusC

Dies wurde mir von Oleg aus dem PrimeFaces-Forum vorgeschlagen und funktioniert:

<h:form id="login" prependId="false"
                onsubmit="document.getElementById('login').action='j_security_check';">

Grüße, Brendan.

16
Oversteer

Es wird nur angezeigt, wenn Sie sich aufgrund Ihrer Webkonfiguration in der JSF-Entwicklung befinden.

<context-param>
        <param-name>javax.faces.PROJECT_STAGE</param-name>
        <param-value>Development</param-value>
    </context-param>

Wenn Sie es in Produktion ändern, wird es nicht mehr angezeigt

4
Carlo Pacheco

Wenn jemand dies eines Tages nützlich finden wird, hatte ich den gleichen Fehler und das Problem war, dass ich eine Primefaces-Komponente habe

<p:something ....

und diese Komponente befand sich nicht im Element <h:form>

3
jNick

Ich benutze Mojarra 2.1.27 und finde heraus, dass dies meine Fehler sind. Es ist jedoch nur sehr schwer zu finden, was die Fehler waren. Hoffentlich könnte jemand aus Mojarra die Komponenten-ID zu den Warnmeldungen hinzufügen. Hier ist, was ich getan habe, um die Komponente herauszufinden: (die auch auf https://code.google.com/p/primefaces/issues/detail?id=1586#c48 gepostet ist)

Ich verfolge es, indem ich den Mojarra-Quellcode herunterlade und der Klasse com.Sun.faces.context.FacesContextImpl die folgende Methode hinzufüge: public void addMessage (String clientId, FacesMessage message). Wenn der Haltepunkt abfängt, öffnen Sie das Debugging-Fenster oder das Call-Stack-Fenster, um festzustellen, ob es von der Klasse com.Sun.faces.application.view.FormOmittedChecker in der Methode private static void addFormOmittedMessage (FacesContext-Kontext) aufgerufen wurde, die zuvor von der Methode aufgerufen wurde

public static void check (FacesContext-Kontext).

innerhalb der Prüfmethode gibt es eine Parametervariablenkomponente. Sie können die Komponenten-ID aus dem Beobachtungs- oder Variablenfenster abrufen und sie dann auf Ihre HTML-Seite und Ihren Code zurückverfolgen.

Es ist ein harter Weg, aber ich hoffe, Sie können die Wurzel der Probleme finden. Es ist viel einfacher, wenn in der Warnmeldung auch die problematische Komponenten-ID angezeigt wird

1
Harun

In meinem Fall wurde diese Warnmeldung in p:messages Angezeigt, das ich in ein Dialogfeld eingefügt habe, um Überprüfungsfehler anzuzeigen. Deshalb habe ich nur severity="error" In p:messages Und eine Warnmeldung eingefügt war weg.

0
matoni