command / command / ajax action / Listener-Methode nicht aufgerufen oder Eingabewert nicht gesetzt / aktualisiert

StackOverflow https://stackoverflow.com/questions/2118656

Frage

Manchmal, bei der Verwendung von <h:commandLink>, <h:commandButton> oder <f:ajax>, die action, actionListener oder listener Methode mit dem Tag zugeordnet sind, einfach nicht aufgerufen werden. Oder die Bean-Eigenschaften nicht mit eingereicht UIInput Werten aktualisiert.

Was sind die möglichen Ursachen und Lösungen für das?

War es hilfreich?

Lösung

Einführung

Wenn eine UICommand Komponente (<h:commandXxx>, <p:commandXxx>, usw.) nicht die zugehörige Aktionsmethode oder eine UIInput Komponente (<h:inputXxx>, <p:inputXxxx>, etc.) aufrufen nicht die vorgelegten Werte zu verarbeiten und / oder die Modellwerte zu aktualisieren, und Sie aren ‚t alle googlable Ausnahmen und / oder Warnungen im Serverprotokoll zu sehen, auch nicht, wenn Sie einen ajax-Exception-Handler konfigurieren per Ausnahmebehandlung in JSF aJAX Anfragen , noch, wenn Sie unter Kontextparametern in web.xml gesetzt,

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

, und Sie sind auch keine googlable Fehler zu sehen und / oder Warnungen in Browser JavaScript Konsole (drücken Sie F12 in Chrom / Firefox23 + / IE9 + den Web-Entwickler-Toolset zu öffnen und öffnen Sie den Console tab), durcharbeiten dann unter Liste der möglichen Ursachen.

Mögliche Ursachen

  1. UICommand und UIInput Komponenten müssen innerhalb einer UIForm Komponente platziert werden, z.B. <h:form> (und damit nicht einfache HTML <form>), sonst kann nichts an den Server gesendet werden. UICommand Komponenten müssen auch nicht type="button" Attribut, sonst wird es ein toter Knopf sein, die für JavaScript onclick nur nützlich ist. Siehe auch Wie Formular senden Eingabewerte und aufrufen einer Methode in JSF Bean und tut keine Postbacks initiieren.

  2. Sie können nicht verschachtelt mehrere UIForm Komponenten ineinander. Dies ist illegal in HTML. Der Browser Verhalten ist nicht spezifiziert. Watch out mit Dateien enthalten! Sie können UIForm Komponenten parallel verwenden, aber sie werden sich nicht gegenseitig während einreichen verarbeiten. Sie sollten auch mit „Gott Form“ Antipattern achten; stellen Sie sicher, dass Sie nicht unbeabsichtigt verarbeite / validate alle andere (unsichtbar) Eingaben in der gleichen Form (zum Beispiel eines versteckten Dialog mit den erforderlichen Eingaben in der gleichen Form). Siehe auch So verwendet in JSF-Seite? Einzel Form? Mehrere Formen? Verschachtelte Formen? .

  3. Nein UIInput Wert Validierung / Konvertierungsfehler aufgetreten sein sollte. Sie können <h:messages> verwenden, um alle Nachrichten anzuzeigen, die nicht von irgendwelchen Eingangsspezifische <h:message> Komponenten gezeigt. Vergessen Sie nicht die id von <h:messages> im <f:ajax render> aufzunehmen, falls vorhanden, so dass es auf AJAX-Anfragen als auch aktualisiert werden. Siehe auch h: Nachrichten keine Nachrichten angezeigt wird, wenn p: command ist gepresster .

  4. Wenn UICommand oder UIInput Komponenten innerhalb eines Iterieren Komponente wie <h:dataTable> platziert sind, <ui:repeat>, etc, dann müssen Sie sicherstellen, dass genau das gleiche value der Iterieren Komponente erhalten geblieben ist während der Anforderungswerte Phase der Form anwenden Anfrage einreichen. JSF wird darüber wiederholen, den klickten Link / Button und eingereichten Eingangswerte zu finden. Putting die Bohne in der Ansicht Umfang und / oder dafür sorgen, dass Sie das Datenmodell in @PostConstruct der Bohne laden (und somit nicht in einer Getter-Methode!) Sollte es beheben. Siehe auch Wie und wann soll ich das Modell aus der Datenbank laden für h:. datatable

  5. Wenn UICommand oder UIInput components durch eine dynamische Quelle enthalten ist, wie <ui:include src="#{bean.include}">, dann müssen Sie sicherstellen, dass genau der gleiche #{bean.include} Wert während der Ansicht Aufbauzeit des Formulars Antrag stellt erhalten bleibt. JSF wird es während der Aufbau der Komponentenbaum erneut auszuführen. Putting die Bohne in der Ansicht Umfang und / oder dafür sorgen, dass Sie das Datenmodell in @PostConstruct der Bohne laden (und somit nicht in einer Getter-Methode!) Sollte es beheben. Siehe auch Wie Ajax-Refresh dynamische umfassen Inhalt von Navigationsmenü? (JSF SPA) .

  6. Das rendered Attribut der Komponente und alle seine Eltern und das test Attribut von jedem Elternteil <c:if> / <c:when> sollten bewerten nicht false während der Anforderungswert Phase der Form anwenden Antrag stellen. JSF wird es im Rahmen des Schutzes vor Manipulation / gehackt Anfragen erneut prüfen. Speichern der Variablen für den Zustand verantwortlich in einer @ViewScoped Bohne oder dafür sorgen, dass Sie die Bedingung in @PostConstruct einer @RequestScoped Bohne richtig sind preinitializing sollte es beheben. Das gleiche gilt für das disabled Attribut der Komponente, die nicht zu true bewerten sollte Anforderungswerte Phase während gelten. Siehe auch JSF Befehl Aktion nicht aufgerufen und Formularkomponente bedingt gemacht einreicht in wird nicht verarbeitet werden.

  7. Das onclick Attribut des UICommand Komponente und das onsubmit Attribut des UIForm Komponente sollten nicht false zurückgeben oder einen JavaScript-Fehler verursachen. Es sollte auch bei <h:commandLink> oder <f:ajax> keine JS seines Fehler sichtbar in dem JS-Konsole des Browsers. Normalerweise die Meldung genauen Fehler googeln gibt Ihnen die Antwort bereits. Hinzufügen von jQuery zu PrimeFaces Ergebnisse in Uncaught TypeErrors Siehe auch .

  8. Wenn Sie Ajax über JSF 2.x <f:ajax> verwenden oder z.B. PrimeFaces <p:commandXxx>, stellen Sie sicher, dass Sie eine <h:head> in der Master-Template anstelle des <head> haben. Sonst wird JSF nicht in der Lage sein, die erforderlichen JavaScript-Dateien automatisch enthalten, die die Ajax-Funktionen enthält. Dies würde zu einem JavaScript-Fehler zur Folge haben wie „mojarra ist nicht definiert“ oder „PrimeFaces ist nicht definiert“ in JS-Konsole des Browsers. Siehe auch h: commandAction wird nicht aufgerufen, wenn mit f verwendet: ajax und ui:. repeat

  9. Wenn Sie Ajax verwenden, und die vorgelegten Werte am Ende null zu sein, stellen Sie sicher, dass die UIInput und UICommand Komponenten von Interesse abgedeckt werden durch die <f:ajax execute> oder z.B. <p:commandXxx process>, sonst werden sie nicht ausgeführt / verarbeitet werden. Siehe auch Übermittelt Formularwerte nicht aktualisiert in Modell beim Hinzufügen bis und Verstehen PrimeFaces verarbeiten / update und JSF f: ajax ausführen / render Attribute

  10. .
  11. Wenn die noch vorgelegt Werte null am Ende wird, und Sie verwenden CDI Bohnen zu verwalten, dann stellen Sie sicher, dass you importieren der Umfang Anmerkung aus dem richtigen Paket, sonst CDI @Dependent ausfällt, die wirksam die Bohne auf jede einzelne Auswertung der EL-Ausdruck erschafft. Siehe auch @SessionScoped bean Los Umfang und wird die ganze Zeit neu erstellt, Felder werden null und Was ist die Standard-Bean Scope in einer JSF-2-Anwendung verwaltet wird?

  12. Wenn ein Elternteil des <h:form> mit der UICommand Taste vorher gemacht worden ist / aktualisiert durch eine Ajax-Anforderung von einer anderen Form auf der gleichen Seite kommt, dann ist die erste Aktion wird immer in JSF 2.2 oder älter scheitern. Die zweiten und die folgenden Aktionen funktionieren. Dies wird durch einen Fehler im Ansichtszustand Handhabung verursacht, die als JSF-Spezifikation Ausgabe berichtet wird 790 und zur Zeit in JSF 2.3 behoben. Für ältere Versionen JSF, müssen Sie explizit die ID des <h:form> im render der <f:ajax> angeben. Siehe auch h: command / h: command funktioniert nicht auf dem ersten Klick, funktioniert nur auf zweiten Klick .

  13. Wenn die <h:form> enctype="multipart/form-data" Satz, um Support-Datei-Upload hat, dann müssen Sie sicherstellen, dass Sie mindestens JSF mit 2,2, oder dass die Servlet-Filter, die für das Parsen von multipart / form-data verantwortlich ist Anfragen korrekt konfiguriert ist, da sonst die FacesServlet am Ende wird keine Anfrage Parameter überhaupt bekommen und somit nicht in der Lage sein, die Anforderungswerte anzuwenden. So konfigurieren Sie ein solcher Filter ist abhängig von der Datei-Upload-Komponente verwendet wird. Für Tomahawk <t:inputFileUpload>, überprüfen Sie diese Antwort und für PrimeFaces <p:fileUpload>, Scheck < a href = "https://stackoverflow.com/questions/8875818/how-to-use-primefaces-pfileupload-listener-method-is-never-invoked/8880083#8880083"> diese Antwort . Oder, wenn Sie tatsächlich keine Datei überhaupt hochladen, dann entfernen Sie das Attribut zusammen.

  14. Stellen Sie sicher, dass das ActionEvent Argument von actionListener ein javax.faces.event.ActionEvent ist und somit nicht java.awt.event.ActionEvent, das ist, was die meisten IDEs als erste Option zur automatischen Vervollständigung. kein Argument zu haben, ist falsch und wenn Sie actionListener="#{bean.method}" verwenden. Wenn Sie nicht ein Argument in Ihrer Methode, Verwendung actionListener="#{bean.method()}" wollen. Oder vielleicht wollen Sie eigentlich action verwenden, anstatt actionListener. Siehe auch Unterschiede zwischen Aktion und Action .

  15. Stellen Sie sicher, dass kein PhaseListener oder jede EventListener in der Anfrage-Antwort-Kette hat die JSF-Lebenszyklus verändert die invoke Aktionsphase durch zum Beispiel Aufruf FacesContext#renderResponse() oder FacesContext#responseComplete().

  16. überspringen
  17. Stellen Sie sicher, dass kein Filter oder Servlet in der gleichen Anfrage-Antwort-Kette die Anfrage fo der FacesServlet irgendwie blockiert hat.

  18. Wenn Sie eine PrimeFaces <p:dialog> oder eine <p:overlayPanel> verwenden, stellen Sie sicher, dass sie ihre eigenen <h:form> haben. Da diese Komponenten standardmäßig durch JavaScript sind verlegt von HTML <body> zu beenden. Also, wenn sie ursprünglich in einem <form> sitzen, dann würden sie jetzt nicht mehr in einem <form> sitzen. Siehe auch p: Command Aktion funktioniert nicht innerhalb p: dialog

  19. Bug im Rahmen. Zum Beispiel hat eine Richfaces „ Umwandlungsfehler “, wenn ein rich:calendar UI-Element mit einem unter Verwendung defaultLabel Attribut (oder, in einigen Fällen ein rich:placeholder Unterelement). Dieser Fehler verhindert, dass die Bean-Methode aus aufgerufen wird, wenn kein Wert für das Kalenderdatum festgelegt ist. Tracing Rahmen Fehler können beginnen mit einem einfachen Arbeits Beispiel und den Aufbau der Seite wieder nach oben durchgeführt werden, bis der Fehler entdeckt wird.

Debuggen Hinweise

Falls Sie noch klemmt, ist es Zeit zu debuggen. In der Client-Seite, drücken Sie F12 in Web-Browser den Web-Entwickler-Toolset zu öffnen. Klicken Sie auf Console Tab so die JavaScript conosle sehen. Es sollte frei von JavaScript-Fehler sein. Im Folgende Screenshot ist ein Beispiel aus Chrom, die den Fall der Vorlage ein <f:ajax> Taste zeigt aktiviert, wenn nicht mit <h:head> erklärt (wie unter Punkt 7 oben beschrieben).

 js Konsole

Klicken Sie auf Netzwerk die Registerkarte HTTP-Traffic-Monitor zu sehen. Senden Sie das Formular und untersuchen, ob die Request-Header und Formulardaten und der Antworttext als pro Erwartungen. Im Folgende Screenshot ist ein Beispiel aus Chrom, die ein erfolgreichen Ajax mit einem einzigen <h:inputText> und einem einzigen <h:commandButton> mit <f:ajax execute="@form" render="@form"> einreicht eine einfache Form zeigt.

 Netzwerkmonitor

(Achtung: wenn Sie Screenshots von HTTP-Request-Header wie oben von einer Produktionsumgebung zu veröffentlichen, macht dann sicher Gerangel Sie / obfuscate keine Session-Cookies im Screenshot zu vermeiden Session Hijacking-Angriffen!)

In der Server-Seite, stellen Sie sicher, dass Server im Debug-Modus gestartet wird. Setzen Sie einen Debug-Haltepunkt in einem Verfahren der JSF-Komponente von Interesse, die Sie erwarten, dass bei der Verarbeitung des Formular aufgerufen werden. Z.B. bei UICommand Komponente, wäre das UICommand#queueEvent() und bei UIInput Komponente, die UIInput#validate() . Nur Schritt für Schritt durch die Ausführung von Code und überprüfen, ob die Vorlauf- und Variablen wie pro Erwartung. Im Folgenden Screenshot ist ein Beispiel von Eclipse-Debugger.

 Debug-Server

Andere Tipps

Wenn Ihr h:commandLink in einem h:dataTable ist es ist ein weiterer Grund, warum die h:commandLink könnte nicht funktionieren:

Die zugrunde liegende Datenquelle, die an den h:dataTable gebunden ist, muss auch in dem zweiten JSF-Lifecycle verfügbar sein, die ausgelöst wird, wenn der Link angeklickt wird.

Also, wenn die zugrunde liegende Datenquelle Anfrage scoped, die h:commandLink funktioniert nicht!

Während meine Antwort nicht zu 100% anwendbar ist, aber die meisten Suchmaschinen dies als ersten Treffer, habe ich beschlossen, es zu schreiben nontheless:

Wenn Sie mit PrimeFaces (oder eine ähnliche API) p:commandButton oder p:commandLink, stehen die Chancen, dass Sie explizit vergessen haben zu process="@this" auf Ihre Befehlskomponenten hinzuzufügen.

Als PrimeFaces Benutzerhandbuch heißt es in Abschnitt 3.18, die Standardeinstellungen für process und update sind beide @form, die so ziemlich die Standardwerte wendet sich gegen Sie aus einfachen JSF f:ajax oder Richfaces erwarten könnte, die jeweils execute="@this" und render="@none" sind.

So nahm mir eine laaange Zeit heraus zu finden. (... und ich denke, es ist eher unclever auf Standardwerte verwenden, die von JSF verschieden sind!)

Ich würde erwähnen eine weitere Sache, dass Bedenken Primefaces des p:commandButton!

Wenn Sie eine p:commandButton für die Aktion verwenden, die Bedürfnisse auf dem Server durchgeführt werden, können Sie nicht type="button" verwenden, weil das für ist Tasten , die verwendet werden benutzerdefinierte Javascript auszuführen, ohne eine Ajax verursacht / nicht-ajax-Request an den Server.

Zu diesem Zweck können Sie das type Attribut verzichten (Standardwert ist "submit") oder explizit type="submit" verwenden können.

Hope Dies wird helfen, jemand!

steckte Got mit diesem Thema selbst und fand eine weitere Ursache für dieses Problem. Wenn Sie Setter-Methoden nicht in Ihrem Backing Bean haben für die Eigenschaften in Ihrem * .xhtml verwendet, dann ist die Aktion ist einfach nicht aufgerufen.

ich vor kurzem lief in ein Problem mit einem UICommand nicht in einer JSF 1.2-Anwendung aufgerufen werden mit Hilfe von IBM erweiterten Faces-Komponenten.

hatte ich eine Befehlsschaltfläche in einer Zeile einer Datentabelle (die erweiterte Version, so <hx:datatable>) und der UICommand würde nicht Feuer aus bestimmten Zeilen aus der Tabelle (die Zeilen, die würde nicht Feuer waren die Reihen größer als die Standard-Zeilendarstellung Größe).

hatte ich ein Drop-down-Komponente für die Anzahl der Zeilen-Display auswählen. Der Wert dieses Feld verlassen war in RequestScope. Die Datensicherung die Tabelle selbst in einer Art ViewScope war (in Wirklichkeit vorübergehend in SessionScope).

Wenn die Zeile Anzeige über die Steuerung erhöht wurde, der Wert auch auf die rows Attribut gebunden wurde die Datentabelle, keine der Reihen als Ergebnis dieser Änderung angezeigt könnte den UICommand feuert, wenn darauf geklickt.

Platzieren Sie dieses Attribut in dem gleichen Umfang wie die Tabellendaten selbst das Problem behoben.

ich denke, das in BalusC # anspielte 4 oben, aber nicht nur, dass der Tabellenwert Notwendigkeit scoped zu Anzeigen oder Session, sondern auch das Attribut der Anzahl der Zeilen zu Anzeige steuert auf dieser Tabelle.

hatte ich dieses Problem auch und nur wirklich in auf die Ursache zu feilen begonnen, nachdem die Web-Konsole des Browsers öffnen. Bis das war ich nicht in der Lage alle Fehlermeldungen (auch bei <p:messages>) zu erhalten. Die Web-Konsole zeigte einen HTTP 405 Statuscode aus dem <h:commandButton type="submit" action="#{myBean.submit}"> kommen zurück.

In meinem Fall habe ich eine Mischung aus Vanille HttpServlet die Bereitstellung von OAuth-Authentifizierung über Auth0 und JSF facelets und Bohnen meine Anwendungsansichten und Business-Logik durchgeführt wird.

Nachdem ich meine web.xml Refactoring und entfernt, um ein Mitte-Mann-Servlet, dann „magische Weise“ gearbeitet.

Unterm Strich war das Problem, dass das Mitte-Mann-Servlet wurde mit RequestDispatcher.forward (...) von der HttpServlet Umgebung in der JSF-Umgebung umgeleitet werden, während des Servlet, bevor es aufgerufen wird wurde Umleitung mit HttpServletResponse.sendRedirect (...).

Im Grunde genommen mit sendRedirect () die JSF "Container" erlaubt die Kontrolle übernehmen, während RequestDispatcher.forward () war offensichtlich nicht.

Was ich nicht weiß, ist, warum die Facelet Lage war, die Bean-Eigenschaften zugreifen konnte sie aber nicht gesetzt, und das schreit eindeutig für die Mischung aus Servlets und JSF tun weg, aber ich hoffe, dass dies jemand vermeiden viele Stunden hilft von Head-to-table-hämmern.

hatte ich viel Spaß ein Problem Debuggen, wo die Aktion eines <h:commandLink> in richfaces datatable Feuer abgelehnt. Die Tabelle verwendete zu einem bestimmten Zeitpunkt zu arbeiten, aber ohne ersichtlichen Grund gestoppt. Ich ließ keinen Stein auf dem anderen, nur um herauszufinden, dass mein rich:datatable die falsche rowKeyConverter wurde mit der NULL-Werte zurückgegeben, die als Zeilenschlüssel glücklich verwendet Richfaces. Das ist meine <h:commandLink> Aktion verhindert, genannt zu werden.

Eine weitere Möglichkeit: Wenn das Symptom ist, dass der erste Aufruf funktioniert, aber nachfolgende die dies nicht tun, können Sie PrimeFaces 3.x mit JSF 2.2 verwenden, wie hier beschrieben: wird keine Viewstate gesendet .

fixed ich mein Problem mit der Platzierung:

<h:commandButton class="btn btn-danger" value = "Remove" action="#{deleteEmployeeBean.delete}"></h:commandButton>

<h:form>
     <h:commandButton class="btn btn-danger" value = "Remove" action="#{deleteEmployeeBean.delete}"></h:commandButton>
</h:form>
<ui:composition>  
  <h:form id="form1">
    <p:dialog id="dialog1">
      <p:commandButton value="Save" action="#{bean.method1}" /> <!--Working-->
    </p:dialog>
  </h:form>

  <h:form id="form2">
    <p:dialog id="dialog2">
      <p:commandButton value="Save" action="#{bean.method2}" /> <!--Not Working-->
    </p:dialog>
  </h:form>
</ui:composition>

Zur Lösung;

<ui:composition>  
  <h:form id="form1">
    <p:dialog id="dialog1">
      <p:commandButton value="Save" action="#{bean.method1}" />   <!-- Working  -->
    </p:dialog>

    <p:dialog id="dialog2">
      <p:commandButton value="Save" action="#{bean.method2}" />   <!--Working  -->
    </p:dialog>
  </h:form>
  <h:form id="form2">
    <!-- ..........  -->
  </h:form>
</ui:composition>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top