372 Stimmen

commandButton/commandLink/ajax action/listener Methode nicht aufgerufen oder Eingabewert nicht gesetzt/aktualisiert

Manchmal, wenn man <h:commandLink> , <h:commandButton> o <f:ajax> , le action , actionListener o listener Methode, die mit dem Tag verknüpft ist, wird einfach nicht aufgerufen. Oder die Bean-Eigenschaften werden nicht mit den übermittelten Daten aktualisiert. UIInput Werte.

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

4voto

Brent C Punkte 823

Ich bin kürzlich auf ein Problem gestoßen, bei dem ein UICommand in einer JSF 1.2-Anwendung mit IBM Extended Faces Components nicht aufgerufen wurde.

Ich hatte eine Befehlsschaltfläche in einer Zeile einer Datentabelle (die erweiterte Version, also <hx:datatable> ) und der UICommand würde bei bestimmten Zeilen der Tabelle nicht ausgelöst werden (die Zeilen, die nicht ausgelöst werden würden, waren die Zeilen, die größer als die Standardzeilengröße sind).

Ich hatte eine Dropdown-Komponente zur Auswahl der Anzahl der anzuzeigenden Zeilen. Der Wert, der dieses Feld unterstützt, war in RequestScope . Die Daten, die die Tabelle selbst unterstützen, waren in einer Art ViewScope (in Wirklichkeit vorübergehend in SessionScope ).

Wenn die Zeilendarstellung über das Steuerelement erhöht wurde, dessen Wert auch an den Wert der Datentabelle rows Attribut, konnte keine der Zeilen, die als Ergebnis dieser Änderung angezeigt wurden, den UICommand auslösen, wenn sie angeklickt wurde.

Das Problem wurde behoben, indem dieses Attribut in den gleichen Bereich wie die Tabellendaten selbst gesetzt wurde.

Ich denke, dass dies in BalusC #4 oben angedeutet wird, aber nicht nur der Tabellenwert muss View oder Session scoped sein, sondern auch das Attribut, das die Anzahl der Zeilen für die Anzeige in dieser Tabelle steuert.

3voto

Brooks Punkte 6531

Ich hatte dieses Problem auch und bin der Ursache erst auf die Spur gekommen, nachdem ich die Webkonsole des Browsers geöffnet hatte. Bis dahin konnte ich keine Fehlermeldungen erhalten (auch nicht mit <p:messages> ). Die Webkonsole zeigte einen HTTP 405-Statuscode an, der von der <h:commandButton type="submit" action="#{myBean.submit}"> .

In meinem Fall habe ich eine Mischung aus Vanilla HttpServlets, die OAuth-Authentifizierung über Auth0 bereitstellen, und JSF-Facelets und -Beans, die meine Anwendungsansichten und Geschäftslogik ausführen.

Nachdem ich meine web.xml umgestaltet und ein Middle-Man-Servlet entfernt hatte, funktionierte es "auf magische Weise".

Unterm Strich war das Problem, dass der Mittelmann-Servlet mit RequestDispatcher.forward(...) von der HttpServlet-Umgebung an die JSF-Umgebung umleiten, während das Servlet, das vor ihm aufgerufen wurde, mit HttpServletResponse.sendRedirect(...) umgeleitet wurde.

Grundsätzlich erlaubte die Verwendung von sendRedirect() dem JSF-"Container", die Kontrolle zu übernehmen, während dies bei RequestDispatcher.forward() offensichtlich nicht der Fall war.

Was ich nicht weiß, ist, warum das Facelet in der Lage war, auf die Bean-Eigenschaften zuzugreifen, sie aber nicht einstellen konnte, und dies schreit eindeutig nach einer Abschaffung der Mischung aus Servlets und JSF, aber ich hoffe, dass dies jemandem hilft, viele Stunden des Kopf-an-Tisch-Schlagens zu vermeiden.

2voto

Mustafa Punkte 4750

Ich hatte viel Spaß bei der Fehlersuche in einem Problem, bei dem ein <h:commandLink> Aktion in richfaces datatable weigerte sich zu schießen. Der Tisch funktionierte irgendwann einmal, aber ohne ersichtlichen Grund nicht mehr. Ich habe nichts unversucht gelassen, nur um herauszufinden, dass mein rich:datatable die falsche rowKeyConverter die Nullen zurückgab, die von Richfaces gerne als Zeilenschlüssel verwendet wurden. Dies verhinderte meine <h:commandLink> Aktion nicht aufgerufen wird.

0voto

Dave Mulligan Punkte 1585

Eine weitere Möglichkeit: Wenn das Symptom darin besteht, dass der erste Aufruf funktioniert, die folgenden jedoch nicht, verwenden Sie möglicherweise PrimeFaces 3.x mit JSF 2.2, wie hier beschrieben: Es wird kein ViewState gesendet .

-1voto

Georgi Peev Punkte 642

Ich habe mein Problem mit der Platzierung der:

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

In:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X