web-dev-qa-db-fra.com

Le composant de formulaire doit avoir un UIForm dans son ascendance. Suggestion: insérez les composants nécessaires dans <h: form>

Voici mon formulaire:

<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>

Cela fonctionne bien avec Glassfish 3.0.1, mais depuis Glassfish 3.1 b2, il affiche cet avertissement sous la forme d'un FacesMessage dans la page JSF:

Le composant de formulaire doit avoir un UIForm dans son ascendance. Suggestion: insérez les composants nécessaires dans <h:form>

Si je change le <form action="j_security_check"> à <h:form>, ça ne le résout pas, je dois placer le <h:form> à l'intérieur de <h:panelGrid>.

38
Thang Pham

C'est juste un Attention pas un Erreur. Les avertissements sont généralement là pour informer le développeur de situations/conditions imprévues qui ne peuvent pas immédiatement causer des erreurs/problèmes techniques. Tout peut fonctionner parfaitement, mais le comportement/les résultats peuvent ne pas être ceux prévus par le développeur. Un développeur débutant peut par exemple avoir accidentellement utilisé <form> au lieu de <h:form>. Des avertissements comme celui-ci sont alors utiles.

Dans votre cas particulier, vous êtes simplement obligé d'utiliser <form> en raison de la nécessité de se soumettre à un service non JSF. En tant que développeur plus expérimenté, vous savez qu'il est légitimement valide. Vous pouvez simplement ignorer cet avertissement. Cet avertissement n'apparaît que lorsque javax.faces.PROJECT_STAGE est de toute façon défini sur Development et pas apparaît lorsqu'il est défini sur Production.

Cependant, le fait qu'il affiche toujours l'avertissement quand il y a un autre composant comme panelgrid entre le formulaire et ses enfants d'entrée, est un bug pour moi. Je le signalerais aux gars de Mojarra. On dirait qu'il vérifie uniquement le parent immédiat et pas tous les parents. Mise à jour : elle a été corrigée selon Mojarra 2.1.3/2.2, voir aussi problème 2147 .

Ce n'est d'ailleurs pas spécifique à Glassfish. La nouvelle version GF bien sûr est livrée avec une version plus récente de Mojarra qui a ces avertissements implémentés. Voir aussi numéro 166 .

Questions connexes:

47
BalusC

Cela m'a été suggéré par Oleg du forum PrimeFaces et fonctionne:

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

Cordialement, Brendan.

16
Oversteer

Il ne s'affiche que si vous êtes en développement JSF en fonction de votre configuration Web.

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

Lorsque vous le changez en Production, il ne s'affichera plus

4
Carlo Pacheco

Si quelqu'un trouve cela utile un jour, j'ai eu la même erreur et le problème était que j'ai un composant primefaces

<p:something ....

et ce composant n'était pas dans l'élément <h:form>

3
jNick

J'utilise Mojarra 2.1.27 et découvre que ce sont mes erreurs. Cependant, c'est juste très difficile de trouver quelles étaient les erreurs. J'espère que quelqu'un de Mojarra pourra ajouter l'identifiant du composant aux messages d'avertissement. Voici ce que j'ai fait pour découvrir le composant: (qui a également publié sur https://code.google.com/p/primefaces/issues/detail?id=1586#c48 )

Je le trace en téléchargeant le code source de Mojarra et en ajoutant un point d'arrêt à la classe com.Sun.faces.context.FacesContextImpl dans la méthode: public void addMessage (String clientId, message FacesMessage). lorsque le point d'arrêt se déclenche, ouvrez la fenêtre de débogage ou la fenêtre de pile d'appels pour découvrir qu'il a été appelé par la classe com.Sun.faces.application.view.FormOmittedChecker dans la méthode private static void addFormOmittedMessage (FacesContext context) qui était précédemment appelée par la méthode

vérification du vide statique public (contexte FacesContext).

à l'intérieur de la méthode de vérification, il y a un composant variable de paramètre. Vous pouvez obtenir l'ID du composant à partir de la fenêtre de surveillance ou de variable, puis le retracer vers votre page html et votre code.

C'est difficile, mais j'espère que vous pouvez trouver la racine des problèmes. Ce sera beaucoup plus simple si le message d'avertissement affiche également l'ID du composant problématique

1
Harun

Dans mon cas, ce message d'avertissement était affiché dans p:messages que j'ai mis dans la boîte de dialogue pour afficher les erreurs de validation, je viens donc d'inclure severity="error"dans p:messages et le message d'avertissement avait disparu.

0
matoni