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.
UICommand
und UIInput
Komponenten müssen innerhalb einer UIForm
Komponente platziert werden, z. B. <h:form>
(und damit kein einfaches HTML <form>
), sonst kann nichts an den Server gesendet werden. UICommand
Komponenten 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 UIForm
Komponenten ineinander verschachteln . Dies ist in HTML illegal. Das Browserverhalten ist nicht angegeben. Achtung mit Include-Dateien! Sie können UIForm
Komponenten 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 UIInput
sollte 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 id
von <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 UICommand
oder UIInput
Komponenten innerhalb einer Iterieren Komponente platziert sind , wie <h:dataTable>
, <ui:repeat>
etc, dann brauchen Sie , dass genau das gleiche , um sicherzustellen , value
der 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 @PostConstruct
die 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 UICommand
oder UIInput
Komponenten 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 @PostConstruct
die 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 rendered
Attribut der Komponente und aller ihrer test
übergeordneten Elemente sowie das Attribut eines übergeordneten Elements <c:if>
/ <c:when>
sollten false
wä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 @ViewScoped
Bohne oder dafür sorgen , dass Sie in den Zustand richtig sind preinitializing @PostConstruct
einer @RequestScoped
Bohne sollte es beheben. Gleiches gilt für das disabled
Attribut der Komponente, das true
wä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 onclick
Attribut der UICommand
Komponente und das onsubmit
Attribut der UIForm
Komponente sollten keinen false
JavaScript-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 UIInput
und die UICommand
interessierenden 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 null
sind 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, @Dependent
um 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 UICommand
Schaltflä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 render
von 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 FacesServlet
Willen 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 ActionEvent
Argument von actionListener
ein javax.faces.event.ActionEvent
und somit nicht java.awt.event.ActionEvent
ist, 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 action
anstelle von verwenden actionListener
. Siehe auch Unterschiede zwischen action und actionListener .
Stellen Sie sicher, dass keine PhaseListener
oder keine EventListener
in 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 Filter
oder Servlet
dieselbe Anforderungs-Antwort-Kette die Anforderung für die FacesServlet
irgendwie 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:calendar
UI-Element mit einem defaultLabel
Attribut (oder in einigen Fällen einem rich:placeholder
Unterelement) 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 UICommand
Komponente wäre das UICommand#queueEvent()
und im Falle einer UIInput
Komponente 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.