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

345

Manchmal, bei der Verwendung von <h:commandLink>, <h:commandButton>oder <f:ajax>das action, actionListeneroder listenerVerfahren mit dem Tag zugeordnet ist , einfach nicht aufgerufen werden. Oder die Bean-Eigenschaften werden nicht mit übermittelten UIInputWerten aktualisiert .

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

Muhammad Hewedy
quelle

Antworten:

687

Einführung

Jedes Mal , wenn eine UICommandKomponente ( <h:commandXxx>, <p:commandXxx>usw.) nicht die zugehörige Aktion Methode aufzurufen oder eine UIInputKomponente ( <h:inputXxx>, <p:inputXxxx>usw.) nicht die vorgelegten Werte und / oder aktualisieren Sie die Modellwerte zu verarbeiten, und Sie sehen keine googlable Ausnahmen und / oder Warnungen im Serverprotokoll, auch nicht, wenn Sie einen Ajax-Ausnahmebehandler gemäß Ausnahmebehandlung in JSF-Ajax-Anforderungen konfigurieren oder wenn Sie den folgenden Kontextparameter in festlegen web.xml.

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

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.

Mögliche Ursachen

  1. 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 .

  2. 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? .

  3. 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 .

  4. 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 .

  5. 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) .

  6. 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 .

  7. 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 .

  8. 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 .

  9. 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 .

  10. 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?

  11. 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 .

  12. 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.

  13. 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 .

  14. 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().

  15. 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 .

  16. 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

  17. 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.

Debugging-Hinweise

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).

js Konsole

Klicken Sie auf die Registerkarte Netzwerk , um den HTTP-Verkehrsmonitor anzuzeigen. Senden Sie das Formular und prüfen Sie, ob die Anforderungsheader und Formulardaten sowie der Antworttext den Erwartungen entsprechen. Der folgende Screenshot zeigt ein Beispiel aus Chrome, das eine erfolgreiche Ajax-Übermittlung eines einfachen Formulars mit einem einzelnen <h:inputText>und einem einzelnen <h:commandButton>mit zeigt <f:ajax execute="@form" render="@form">.

Netzwerkmonitor

(Warnung: Wenn Sie Screenshots von HTTP-Anforderungsheadern wie oben aus einer Produktionsumgebung veröffentlichen, stellen Sie sicher, dass Sie alle Sitzungscookies im Screenshot verschlüsseln / verschleiern, um Angriffe auf Sitzungsentführungen zu vermeiden!)

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.

Debug-Server

BalusC
quelle
1
Ihr zweiter Punkt hat mich zum Nachdenken gebracht - für eine lange Zeit. Ich habe gerade herausgefunden, dass ein f: view-Tag in meiner Hauptdatei die Ursache für die meisten meiner Probleme ist. Und wahrscheinlich, weil es eine Form rendert, oder?
Paulo Guedes
2
@pauloguedes Ich kann nichts finden, das besagt, dass f: view ein Formular rendert. Mein Verständnis ist, dass es nur ein Container ist. Nach meiner Erfahrung rendert f: view keine Elemente.
Lucas
@balusc Eine kleine Klarstellung zu Punkt 4: Wenn der commandLink nicht in der dataTable selbst enthalten ist, spielt es dann noch eine Rolle?
Lucas
danke, der Punkt ist der Punkt: Wenn Sie die Bean in den Ansichtsbereich einfügen und / oder sicherstellen, dass Sie das Datenmodell in den (Post-) Konstruktor der Bean laden (und damit nicht in die Getter-Methode!), sollte dies behoben werden.
Merveotesi
2
@ Kukeltje: das hätte eine EL-Ausnahme ausgelöst (bereits durch 1. Absatz in der Antwort abgedeckt)
BalusC
54

Wenn Sie h:commandLinksich in einem h:dataTablebefinden, gibt es einen anderen Grund, warum das h:commandLinkmöglicherweise nicht funktioniert:

Die zugrunde liegende Datenquelle, die an die gebunden ist, h:dataTablemuss auch im zweiten JSF-Lebenszyklus verfügbar sein, der beim Klicken auf den Link ausgelöst wird.

Wenn die zugrunde liegende Datenquelle einen Anforderungsbereich hat, h:commandLinkfunktioniert die nicht!

jbandi
quelle
2
Ok, das war mir nicht ganz klar. Ich hoffe, meine Antwort ist trotzdem hilfreich, da ich mich zumindest in meinem Fall nicht explizit mit UICommand / UIData befasst habe. Die "Lösung" bestand darin, eine Backing Bean vom Anforderungsbereich zum Sitzungsbereich zu befördern ...
jbandi
1
Ich zweite Jens Kommentar ... das Setzen meiner RequestScoped Bean auf SessionScoped machte den Unterschied auf meiner Datentabelle - danke
Zack Macomber
28

Obwohl meine Antwort nicht zu 100% zutreffend ist, aber die meisten Suchmaschinen dies als ersten Treffer ansehen, habe ich mich dennoch entschlossen, sie zu veröffentlichen:

Wenn Sie PrimeFaces (oder eine ähnliche API) p:commandButtonoder verwenden p:commandLink, haben Sie möglicherweise vergessen process="@this", Ihre Befehlskomponenten explizit hinzuzufügen .

Als Leitfaden erklärt die PrimeFaces Benutzer in Abschnitt 3.18, die Standardeinstellungen für processund updatesind beide @form, die so ziemlich die Standardwerte wendet sich gegen Sie aus einfachen JSF erwarten f:ajaxoder Richfaces, die sind execute="@this"und render="@none"jeweils.

Ich habe nur eine lange Zeit gebraucht, um es herauszufinden. (... und ich denke, es ist ziemlich unkonventionell, Standardeinstellungen zu verwenden, die sich von JSF unterscheiden!)

Kawu
quelle
6
Der Standardwert für PrimeFaces processist @form. Wenn die Aktion also nicht auf diese Weise aufgerufen wird, sondern bei der Verwendung @this, gilt höchstwahrscheinlich Punkt 3 meiner Antwort.
BalusC
3
Das kann nicht sein. Ich hatte eine p:commandButton, die die actionListener-Methode erst aufrief, als ich sie hinzufügte process="@this". Darüber hinaus werden im PrimeFaces-Benutzerhandbuch die in den Abschnitten 3.18 und 3.19 genannten Standardeinstellungen explizit aufgeführt. Es ist hier: primefaces.googlecode.com/files/primefaces_users_guide_3_4.pdf ... vielleicht wurden die Standardeinstellungen geändert?
Kawu
8
Es ist wahrscheinlich ein Fehler in der Dokumentation. Entfernen process="@this"und Hinzufügen <p:messages autoUpdate="true">(oder lesen Sie einfach das Serverprotokoll für Nachrichten in der Warteschlange, aber nicht angezeigt) und Sie werden sehen, dass tatsächlich ein Konvertierungs- / Validierungsfehler aufgetreten ist.
BalusC
Warum haben Sie diese Frage entfernt ? Stackoverflow.com/questions/60673695/…
Kukeltje
Ich dachte, es könnte jetzt nicht viel Wert bieten ... Ich habe es wieder gelöscht.
Kawu
9

Ich würde noch eine Sache erwähnen, die Primefaces betrifft p:commandButton!

Wenn Sie a p:commandButtonfür die Aktion verwenden, die auf dem Server ausgeführt werden muss, können Sie diese nicht verwenden, type="button"da dies für Drucktasten gilt, mit denen benutzerdefiniertes Javascript ausgeführt wird, ohne dass eine Ajax- / Nicht-Ajax-Anforderung an den Server gesendet wird.

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

Hoffe das hilft jemandem!

akelec
quelle
Dies war mein Hauptproblem auf einer unserer Seiten. Keiner der Punkte in der akzeptierten Antwort brachte uns näher. Wo haben Sie diese Informationen gefunden?
Uriel Arvizu
Nun, ich hatte dieses Problem schon oft, und ich habe nachgeforscht und festgestellt, dass p:commandButtones die verschiedenen Werte von typeAttributen hat und buttonalles, was die Client-Seite betrifft. Es ist ein bisschen schwer, dies in Primefacesdoc zu finden , aber hier ist ein Link: developer.am/primefaces/…
akelec
Ihr Submit-Hinweis hat mein Problem gelöst, mit dem ich seit Tagen konfrontiert bin. Vielen Dank für Ihren Beitrag!
gpuk360
Danke, es ist mir ein Vergnügen. Ich habe diese Antwort absichtlich gegeben, weil viele von uns ein solches Problem hatten. Ich hatte auch ein paar Tage verloren, bis mir klar wurde, worum es geht.
Akelec
3

Ich habe mich selbst mit diesem Problem beschäftigt und eine weitere Ursache für dieses Problem gefunden. Wenn Ihre Backing Bean keine Setter-Methoden für die in Ihrer * .xhtml verwendeten Eigenschaften enthält, wird die Aktion einfach nicht aufgerufen.

Dnavir
quelle
5
Es hätte zu einer ziemlich selbsterklärenden führen sollen PropertyNotWritableException. Wenn Sie es nicht gesehen haben, haben Sie möglicherweise eine Ajax-Anfrage ohne einen geeigneten Ajax-Ausnahmebehandler ausgelöst, aber Sie sollten es in Serverprotokollen sehen.
BalusC
3
Diese Ausnahme wurde erst angezeigt, als ich p: commandButtons ajax = "false" erstellt habe.
Dnavir
DANKE GOTT, du hast mein Leben gerettet
Exrezzo
3

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

Ich hatte eine Befehlsschaltfläche in einer Zeile einer Datentabelle (also die erweiterte Version <hx:datatable>) und der UICommand wurde nicht aus bestimmten Zeilen aus der Tabelle ausgelöst (die Zeilen, die nicht ausgelöst wurden, waren die Zeilen, die größer als die Standardzeilenanzeige waren).

Ich hatte eine Dropdown-Komponente zum Auswählen der Anzahl der anzuzeigenden Zeilen. Der Wert, der dieses Feld unterstützt, war in RequestScope. Die Daten, die die Tabelle selbst sichern, befanden sich in einer Art ViewScope(in Wirklichkeit vorübergehend in SessionScope).

Wenn die rowsZeilenanzeige über das Steuerelement erhöht wurde, welcher Wert auch an das Attribut der Datentabelle gebunden war , konnte keine der als Ergebnis dieser Änderung angezeigten Zeilen den UICommand auslösen, wenn darauf geklickt wurde.

Durch Platzieren dieses Attributs im selben Bereich wie die Tabellendaten selbst wurde das Problem behoben.

Ich denke, dass dies in BalusC # 4 oben erwähnt wird, aber nicht nur der Tabellenwert musste einen Gültigkeitsbereich für Ansicht oder Sitzung haben, sondern auch das Attribut, das die Anzahl der Zeilen steuert, die in dieser Tabelle angezeigt werden sollen.

Brent C.
quelle
2

Ich hatte auch dieses Problem und begann erst nach dem Öffnen der Webkonsole des Browsers wirklich, die Grundursache zu untersuchen. Bis dahin konnte ich keine Fehlermeldungen erhalten (auch nicht mit <p:messages>). Die Webkonsole zeigte einen HTTP 405-Statuscode an, der von der zurückkam <h:commandButton type="submit" action="#{myBean.submit}">.

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

Nachdem ich meine web.xml überarbeitet und ein Middle-Man-Servlet entfernt hatte, funktionierte es "magisch".

Unterm Strich bestand das Problem darin, dass das Middle-Man-Servlet RequestDispatcher.forward (...) verwendete, um von der HttpServlet-Umgebung in die JSF-Umgebung umzuleiten, während das zuvor aufgerufene Servlet mit HttpServletResponse.sendRedirect (.. .).

Grundsätzlich ermöglichte 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 auf die Bean-Eigenschaften zugreifen konnte, diese aber nicht einstellen konnte, und dies schreit eindeutig danach, die Mischung aus Servlets und JSF zu beseitigen, aber ich hoffe, dies hilft jemandem, viele Stunden Kopf zu vermeiden. zu Tisch schlagen.

Brooks
quelle
1

Ich hatte viel Spaß beim Debuggen eines Problems, bei dem sich <h:commandLink>die Aktion von a richfaces datatableweigerte, zu feuern. Der Tisch funktionierte früher, blieb aber ohne ersichtlichen Grund stehen. Ich ließ nichts unversucht, nur um herauszufinden, dass ich rich:datatabledas Falsche verwendete, rowKeyConverterdas Nullen zurückgab, die Richfaces gerne als Zeilenschlüssel verwendeten. Dies verhinderte, dass meine <h:commandLink>Aktion aufgerufen wurde.

Mustafa
quelle
0

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

Dave Mulligan
quelle
-1

Ich habe mein Problem mit der Platzierung behoben:

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

Im:

<h:form>
     <h:commandButton class="btn btn-danger" value = "Remove" action="#{deleteEmployeeBean.delete}"></h:commandButton>
</h:form>
Georgi Peev
quelle
Das ist die Nummer 1 in der Antwort mit> 600 Stimmen. Sie müssen es nicht als separate Antwort schreiben.
Kukeltje
-1

Dies ist die Lösung, die für mich funktioniert.

<p:commandButton id="b1" value="Save" process="userGroupSetupForm"
                    actionListener="#{userGroupSetupController.saveData()}" 
                    update="growl userGroupList userGroupSetupForm" />

Hier ist process = "userGroupSetupForm" atrribute für den Ajax-Aufruf obligatorisch. actionListener ruft eine Methode von @ViewScope Bean auf. Aktualisieren Sie auch die Growl-Nachricht Datatable: userGroupList und Form: userGroupSetupForm.

Rajib Kumer Ghosh
quelle
-2
<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>

Lösen;

<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>
Kenan Gökbak
quelle
Sorry, aber das ist meiner bescheidenen Meinung nach absolut nicht wahr. Sie geben effektiv an, dass 2 Dialoge in ihrer eigenen Form vorliegen müssen, um zu funktionieren. Sie hatten mit 99% iger Sicherheit ein anderes Problem, das Sie gelöst haben und für das Sie jetzt denken, dass dies die Lösung ist ...
Kukeltje
Diese Seite ist enthalten. Möglicherweise kann dies zu Problemen führen. Sie sollten es vor der Abstimmung testen.
Kenan Gökbak
Nein, Sie sollten vor dem Posten ein minimal reproduzierbares Beispiel erstellt haben (und nur dann kann ich es testen) ... Und ja, Includes können zu Problemen mit Dialogen und Formularen führen, aber dann ist das Problem immer noch nicht das, was Sie hier zu lösen scheinen . Ihr erstes Beispiel ist vollkommen in Ordnung und das zweite ist mit 100% iger Sicherheit keine Lösung eines nicht existierenden Problems
Kukeltje
Wie auch immer. Meine Bewerbung funktioniert einwandfrei. Ich denke, es ist nicht wichtig, wo Dialogfelder im Formular. Ich muss ein zweites Formular erstellen, um ein anderes Problem zu lösen.
Kenan Gökbak
Ihre Anwendung funktioniert möglicherweise, aber das ist aus einem ursprünglichen Problem und Ihrer Lösung nicht klar / ersichtlich. Außerdem sagst du _ "Ich denke, es ist nicht wichtig, wo Dialogfelder im Formular angezeigt werden." _Aber in deiner Antwort scheint es wichtig zu sein, wo sie sich befinden. Ein Widerspruch, der meine Aussage stützt. Entschuldigung, aber Ihre Antwort ist eindeutig falsch ... (es gibt bereits eine weitere Ablehnung)
Kukeltje