371 votes

commandLink / commandButton sauvegarde méthode d’action haricot ne pas invoqué

J’ai trouvé un problème lorsque vous utilisez le ou dans une page d’inclure la et associées à la `` composant n’est simplement pas invoquée. Quelles sont les causes possibles et solutions pour cela ?

725voto

BalusC Points 498232

Chaque fois qu'un UICommand composant ne parvient pas à invoquer l'action associée méthode ou un UIInput élément ne parvient pas à mettre à jour la valeur de modèle, puis vérifiez les points suivants:

  1. UICommand et UIInput des composants doivent être placés à l'intérieur d'un UIForm composant, par exemple, <h:form>.

  2. Vous ne pouvez pas imbriquer plusieurs UIForm composants les uns dans les autres. C'est à savoir illégales en HTML. Attention à inclure des fichiers!

  3. Pas de UIInput de la valeur de la validation ou de la conversion d'erreur doit avoir été produite. Vous pouvez utiliser <h:messages> pour afficher tous les messages qui ne sont pas représentés par une entrée spécifique <h:message> composants. N'oubliez pas d'inclure l' id de <h:messages> dans la <f:ajax render>, le cas échéant, de sorte qu'il sera mis à jour, ainsi que sur les requêtes ajax.

  4. Si UICommand ou UIInput des composants sont placés à l'intérieur d'une itération composant ( <h:dataTable>, <ui:repeat>,, etc, alors vous devez vous assurer que exactement le même value de la composante a été conservé au cours de l'appliquer les valeurs de demande phase de la soumettre le formulaire de demande. JSF va savoir réitérer plus à trouver le lien cliqué bouton/et soumis valeurs d'entrée. Mettre la fève dans la portée de vue et/ou de faire en sorte que vous chargez le modèle de données en @PostConstruct de la fève (et donc pas dans une méthode de lecture!) devrait résoudre le problème.

  5. L' rendered de l'attribut de composant et tous les composants parent ne doit pas évaluer à l' false au cours de l'appliquer les valeurs de demande phase de la soumettre le formulaire de demande. JSF va savoir le réactiver ensuite dans le cadre de mesures de protection contre trafiqué piraté demandes. Mettre la fève dans la portée de vue et/ou de faire en sorte que vous êtes preinitializing la condition en (post), le constructeur de la fève devrait résoudre le problème. La même chose s'applique à l' disabled attribut du composant, ce qui ne devrait pas évaluer à l' true lors du traitement du formulaire de soumission.

  6. L' onclick attribut de l' UICommand du composant et de l' onsubmit attribut de l' UIForm composant ne doit pas renvoyer false ou causer une erreur JavaScript. Il devrait en cas d' <h:commandLink> ou <f:ajax> également pas de JS erreurs dans le document. Dans les navigateurs récents vous pouvez appuyer sur la touche F12 pour obtenir sur le web développeur d'outils avec la JS console. Tous les JS erreurs seront enregistrées. Généralement googler le message d'erreur exact vais déjà vous donner la réponse.

  7. Si vous êtes en utilisant JSF 2.x <f:ajax> sur la commande de composants, assurez-vous que vous avez un <h:head> dans le maître-modèle, à la place de l' <head>. Sinon JSF ne sera pas en mesure d'auto-include nécessaires jsf.js fichier JavaScript qui contient les fonctions Ajax. Ce résultat serait une erreur de JavaScript comme "mojarra est pas défini" dans le JS de la console.

  8. Si l'un des parents de l' <h:form> avec l' UICommand bouton est été rendus/mis à jour par une requête ajax à l'avance, puis la première action échouera toujours. La deuxième et les suivantes actions de travail. Cela est dû à un bogue dans l'état d'affichage de la manipulation qui est déclaré comme JSF éd. 790 et actuellement prévue pour être fixée dans JSF 2.3. Pour les anciens JSF versions, vous devez explicitement spécifier l'ID de l' <h:form> dans la render de la <f:ajax>, ou pour utiliser le script dans cette réponse.

  9. Si l' <h:form> a enctype="multipart/form-data" ensemble afin de soutenir le fichier de téléchargement, vous devez vous assurer que le filtre de servlet qui est responsable de l'analyse multipart/form-data " demande est correctement configuré, sinon l' FacesServlet finirez toujours pas de paramètres de la requête à tous, et ainsi ne pas être en mesure d'appliquer les valeurs de demande. Comment faire pour configurer un filtre dépend de l'upload de fichier du composant utilisé. Pour Tomahawk <t:inputFileUpload>, cochez cette réponse et pour PrimeFaces <p:fileUpload>, cochez cette réponse. Ou, si vous êtes réellement pas le téléchargement d'un fichier, puis supprimez l'attribut en tout.

  10. Assurez-vous que l' ActionEvent argument de l' actionListener est javax.faces.event.ActionEvent et n'est donc pas java.awt.event.ActionEvent, ce qui est ce que la plupart des IDEs suggèrent que la 1ère option d'auto-complétion.

  11. Assurez-vous qu'aucun PhaseListener ou tout EventListener dans la requête-réponse de la chaîne a changé la JSF le cycle de vie d'ignorer l'invoquer la phase d'action, par exemple, en appelant FacesContext#renderResponse() ou FacesContext#responseComplete().

  12. Assurez-vous qu'aucun Filter ou Servlet dans la même requête-réponse de la chaîne a bloqué la demande fo l' FacesServlet en quelque sorte.

Mon pari que votre problème est causé par le point 2: des formulaires imbriqués. Vous avez probablement déjà un <h:form> dans la page parent qui enveloppe le fichier include. Le fichier à inclure lui-même devrait pas avoir un <h:form>. Vous pouvez également le fixer à l'inverse, s'assurer que le parent n'est pas d' avoir un <h:form> autour de la place de l'include de fichier.

56voto

jbandi Points 4896

Si votre est à l’intérieur d’une il y a une autre raison pourquoi les h:commandLink peuvent ne pas fonctionner :

La source de données sous-jacente qui est liée à la `` doivent également être disponibles dans le deuxième JSF-du cycle de vie qui est déclenché lorsque l’utilisateur clique sur le lien.

Donc, si la source de données sous-jacente est demande étendue, le `` ne fonctionne pas !

33voto

Kawu Points 3642

Tandis que ma réponse n'est pas de 100% applicable, mais la plupart des moteurs de recherche de trouver ce que le premier succès, j'ai décidé de le poster néanmoins:

Si vous êtes à l'aide de PrimeFaces (ou similaire API) p:commandButton ou p:commandLink, les chances sont que vous avez oublié d'ajouter explicitement process="@this" sur votre commande de composants.

Comme le PrimeFaces de l'Utilisateur de Guider les états dans la section 3.18, les valeurs par défaut pour process et update sont à la fois @form, dont pratiquement tout oppose les valeurs par défaut que vous pourriez vous attendre à partir de la plaine de JSF f:ajax ou RichFaces, qui sont execute="@this" et render="@none" respectivement.

Juste m'a fallu un looong moment de découvrir. (... et je pense que c'est plutôt unclever pour utiliser les valeurs par défaut qui sont différentes de JSF!)

1voto

kfatih Points 61

Si vous avez utilisé en tag, voir cette réponse : http://stackoverflow.com/a/6763215/1189324

-1voto

ChannaB Points 14

J’ai aussi eu un problème comme ça quand je travaillais dans un projet. Dans mon cas ActionListner méthode ne s’appelait pas parce qu’il y avait deux éléments de formulaire dans la page ; l’un du modèle et l’autre de la page.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X