Außerdem werden in der JavaScript-Konsole des Browsers keine googlable Fehler und / oder Warnungen angezeigt (drücken Sie F12 in Chrome / Firefox23 + / IE9 +, um das Toolset für Webentwickler zu öffnen, und öffnen Sie dann die Registerkarte Konsole ). Arbeiten Sie dann die folgende Liste möglicher Ursachen durch.
UICommandund UIInputKomponenten müssen innerhalb einer UIFormKomponente platziert werden, z. B. <h:form>(und damit kein einfaches HTML <form>), sonst kann nichts an den Server gesendet werden. UICommandKomponenten dürfen auch keine type="button"Attribute haben, sonst ist es eine tote Schaltfläche, die nur für JavaScript nützlich ist onclick. Siehe auch So senden Sie Formulareingabewerte und rufen eine Methode in der JSF-Bean auf, und <h: commandButton> initiiert kein Postback .
Sie können nicht mehrere UIFormKomponenten ineinander verschachteln . Dies ist in HTML illegal. Das Browserverhalten ist nicht angegeben. Achtung mit Include-Dateien! Sie können UIFormKomponenten parallel verwenden, diese verarbeiten sich jedoch beim Senden nicht gegenseitig. Sie sollten auch mit "God Form" Antipattern aufpassen; Stellen Sie sicher, dass Sie nicht alle anderen (unsichtbaren) Eingaben in derselben Form unbeabsichtigt verarbeiten / validieren (z. B. einen versteckten Dialog mit den erforderlichen Eingaben in derselben Form). Siehe auch Verwendung von <h: form> auf der JSF-Seite. Einzelform? Mehrere Formen? Verschachtelte Formulare? .
Es UIInputsollte kein Wertüberprüfungs- / Konvertierungsfehler aufgetreten sein. Sie können <h:messages>damit alle Nachrichten anzeigen, die von keinen eingabespezifischen <h:message>Komponenten angezeigt werden . Vergessen Sie nicht, das idvon <h:messages>in das <f:ajax render>, falls vorhanden, aufzunehmen, damit es auch bei Ajax-Anfragen aktualisiert wird. Siehe auch h: messages zeigt keine Meldungen an, wenn p: commandButton gedrückt wird .
Wenn UICommandoder UIInputKomponenten innerhalb einer Iterieren Komponente platziert sind , wie <h:dataTable>, <ui:repeat>etc, dann brauchen Sie , dass genau das gleiche , um sicherzustellen , valueder Iterieren Komponente erhalten geblieben ist während der Anforderungswerte Phase des Formulars Antrag stellen beantragen. JSF wiederholt dies, um den angeklickten Link / die angeklickte Schaltfläche und die übermittelten Eingabewerte zu finden. Wenn Sie die Bean in den Ansichtsbereich einfügen und / oder sicherstellen, dass Sie das Datenmodell in @PostConstructdie Bean laden (und damit nicht in eine Getter-Methode!), Sollte dies behoben werden. Siehe auch Wie und wann soll ich das Modell aus der Datenbank für h laden: Datatable .
Wenn UICommandoder UIInputKomponenten von einer dynamischen Quelle wie z. B. enthalten sind <ui:include src="#{bean.include}">, müssen Sie sicherstellen, dass #{bean.include}während der Ansichtserstellungszeit der Formularübermittlungsanforderung genau derselbe Wert beibehalten wird. JSF führt es beim Erstellen des Komponentenbaums erneut aus. Wenn Sie die Bean in den Ansichtsbereich einfügen und / oder sicherstellen, dass Sie das Datenmodell in @PostConstructdie Bean laden (und damit nicht in eine Getter-Methode!), Sollte dies behoben werden. Siehe auch Wie kann ich dynamische Include-Inhalte über das Navigationsmenü aktualisieren? (JSF SPA) .
Das renderedAttribut der Komponente und aller ihrer testübergeordneten Elemente sowie das Attribut eines übergeordneten Elements <c:if>/ <c:when>sollten falsewährend der Phase zum Anwenden von Anforderungswerten des Formulars zum Senden von Anforderungen nicht ausgewertet werden . JSF überprüft dies erneut, um sich vor manipulierten / gehackten Anforderungen zu schützen. Speichern der Variablen für den Zustand verantwortlich in einer @ViewScopedBohne oder dafür sorgen , dass Sie in den Zustand richtig sind preinitializing @PostConstructeiner @RequestScopedBohne sollte es beheben. Gleiches gilt für das disabledAttribut der Komponente, das truewährend der Phase der Anwendung der Anforderungswerte nicht ausgewertet werden sollte . Siehe auch JSF CommandButton-Aktion nicht aufgerufen , Formularübermittlung in bedingt gerenderter Komponente wird nicht verarbeitet undh: commandButton funktioniert nicht, wenn ich es in eine <h: panelGroup gerendert> verpacke .
Das onclickAttribut der UICommandKomponente und das onsubmitAttribut der UIFormKomponente sollten keinen falseJavaScript-Fehler zurückgeben oder verursachen. In der JS-Konsole des Browsers sollten im Falle <h:commandLink>oder <f:ajax>auch keine JS-Fehler sichtbar sein. Wenn Sie die genaue Fehlermeldung googeln, erhalten Sie normalerweise bereits die Antwort. Siehe auch Manuelles Hinzufügen / Laden von jQuery mit PrimeFaces führt zu nicht erfassten TypeErrors .
Wenn Sie Ajax über JSF 2.x <f:ajax>oder z. B. PrimeFaces verwenden <p:commandXxx>, stellen Sie sicher, dass Sie eine <h:head>in der Master-Vorlage anstelle von haben <head>. Andernfalls kann JSF die erforderlichen JavaScript-Dateien, die die Ajax-Funktionen enthalten, nicht automatisch einschließen. Dies würde zu einem JavaScript-Fehler wie "Mojarra ist nicht definiert" oder "PrimeFaces ist nicht definiert" in der JS-Konsole des Browsers führen. Siehe auch h: commandLink actionlistener wird bei Verwendung mit f: ajax und ui: repeat nicht aufgerufen .
Wenn Sie Ajax verwenden und die übermittelten Werte am Ende sind null, stellen Sie sicher, dass die UIInputund die UICommandinteressierenden Komponenten durch das <f:ajax execute>oder z. B. abgedeckt sind <p:commandXxx process>, da sie sonst nicht ausgeführt / verarbeitet werden. Siehe auch Übermittelte Formularwerte, die im Modell nicht aktualisiert wurden, wenn <f: ajax> zu <h: commandButton> hinzugefügt wurde, und Grundlegendes zu PrimeFaces-Prozess- / Aktualisierungs- und JSF f: ajax-Ausführungs- / Renderattributen .
Wenn die übermittelten Werte immer noch gültig nullsind und Sie CDI zum Verwalten von Beans verwenden, stellen Sie sicher, dass Sie die Bereichsanmerkung aus dem richtigen Paket importieren. Andernfalls wird CDI standardmäßig verwendet, @Dependentum die Bean bei jeder einzelnen Auswertung der EL effektiv neu zu erstellen Ausdruck. Siehe auch @SessionScoped Bean verliert den Gültigkeitsbereich und wird ständig neu erstellt, Felder werden null und Was ist der Standardbereich für verwaltete Bean in einer JSF 2-Anwendung?
Wenn ein übergeordnetes Element <h:form>mit der UICommandSchaltfläche zuvor durch eine Ajax-Anforderung gerendert / aktualisiert wurde, die von einem anderen Formular auf derselben Seite stammt, schlägt die erste Aktion in JSF 2.2 oder älter immer fehl. Die zweite und die folgenden Aktionen funktionieren. Dies wird durch einen Fehler in der Behandlung des Ansichtsstatus verursacht, der als JSF-Spezifikationsproblem 790 gemeldet und derzeit in JSF 2.3 behoben wird. Für ältere Versionen JSF, müssen Sie explizit die ID der spezifizieren <h:form>in der rendervon der <f:ajax>. Siehe auch h: commandButton / h: commandLink funktioniert nicht beim ersten Klick, sondern nur beim zweiten Klick .
Wenn das <h:form>ist , enctype="multipart/form-data"um Support - Datei - Upload festlegen, dann müssen Sie sicherstellen , dass Sie mindestens JSF 2.2 verwenden, oder dass die Servlet - Filter , die für das Parsen von multipart / form-data - Anforderungen verantwortlich ist richtig konfiguriert ist , da sonst den FacesServletWillen Am Ende erhalten Sie überhaupt keine Anforderungsparameter und können daher die Anforderungswerte nicht anwenden. Wie ein solcher Filter konfiguriert wird, hängt von der verwendeten Datei-Upload-Komponente ab. Für Tomahawk <t:inputFileUpload>, überprüfen Sie diese Antwort und für PrimeFaces <p:fileUpload>, überprüfen Sie diese Antwort . Wenn Sie tatsächlich überhaupt keine Datei hochladen, entfernen Sie das Attribut vollständig.
Stellen Sie sicher, dass das ActionEventArgument von actionListenerein javax.faces.event.ActionEventund somit nicht java.awt.event.ActionEventist, was die meisten IDEs als erste Option für die automatische Vervollständigung vorschlagen. Kein Argument zu haben ist auch falsch, wenn Sie verwenden actionListener="#{bean.method}". Wenn Sie kein Argument in Ihrer Methode möchten, verwenden Sie actionListener="#{bean.method()}". Oder vielleicht möchten Sie tatsächlich actionanstelle von verwenden actionListener. Siehe auch Unterschiede zwischen action und actionListener .
Stellen Sie sicher, dass keine PhaseListeneroder keine EventListenerin der Anforderungs- / Antwortkette den JSF-Lebenszyklus geändert hat, um die Aufrufaktionsphase zu überspringen, indem Sie beispielsweise FacesContext#renderResponse()oder aufrufen FacesContext#responseComplete().
Stellen Sie sicher, dass keine Filteroder Servletdieselbe Anforderungs-Antwort-Kette die Anforderung für die FacesServletirgendwie blockiert hat . Zum Beispiel Anmelde- / Sicherheitsfilter wie Spring Security. Insbesondere bei Ajax-Anfragen, die standardmäßig überhaupt kein Feedback zur Benutzeroberfläche erhalten. Siehe auch Spring Security 4 und PrimeFaces 5 AJAX-Anforderungsbearbeitung .
Wenn Sie ein PrimeFaces <p:dialog>oder ein PrimeFaces verwenden <p:overlayPanel>, stellen Sie sicher, dass diese ihre eigenen haben <h:form>. Da diese Komponenten standardmäßig von JavaScript an das Ende von HTML verschoben werden <body>. Wenn sie also ursprünglich in einem <form>sitzen würden, würden sie jetzt nicht mehr in einem sitzen <form>. Siehe auch p: Befehlsschaltflächenaktion funktioniert im p: -Dialog nicht
Fehler im Framework. Beispielsweise weist RichFaces einen " Konvertierungsfehler " auf, wenn ein rich:calendarUI-Element mit einem defaultLabelAttribut (oder in einigen Fällen einem rich:placeholderUnterelement) verwendet wird. Dieser Fehler verhindert, dass die Bean-Methode aufgerufen wird, wenn für das Kalenderdatum kein Wert festgelegt ist. Das Verfolgen von Framework-Fehlern kann erreicht werden, indem Sie mit einem einfachen Arbeitsbeispiel beginnen und die Seite wieder aufbauen, bis der Fehler entdeckt wird.
Falls Sie immer noch stecken bleiben, ist es Zeit zum Debuggen. Drücken Sie auf der Clientseite im Webbrowser F12, um das Webentwickler-Toolset zu öffnen. Klicken Sie auf die Registerkarte Konsole , um das JavaScript-Conosle anzuzeigen. Es sollte frei von JavaScript-Fehlern sein. Der folgende Screenshot zeigt ein Beispiel aus Chrome, das den Fall zeigt, dass eine <f:ajax>aktivierte Schaltfläche gesendet wird, ohne sie <h:head>deklariert zu haben (wie in Punkt 7 oben beschrieben).
Stellen Sie auf der Serverseite sicher, dass der Server im Debug-Modus gestartet wird. Fügen Sie einen Debug-Haltepunkt in eine Methode der interessierenden JSF-Komponente ein, die Sie voraussichtlich während der Verarbeitung des Formulars aufrufen werden. Zum Beispiel im Falle einer UICommandKomponente wäre das UICommand#queueEvent()und im Falle einer UIInputKomponente wäre das UIInput#validate(). Gehen Sie einfach die Codeausführung durch und prüfen Sie, ob der Ablauf und die Variablen den Erwartungen entsprechen. Der folgende Screenshot zeigt ein Beispiel aus dem Eclipse-Debugger.