commandButton/commandLink / akcja ajax / metoda listener nie została wywołana lub wartość wejściowa nie została ustawiona/zaktualizowana

Czasami, gdy używasz <h:commandLink>, <h:commandButton> lub <f:ajax>,action, actionListener lub {[5] } Metody powiązane z tagiem po prostu nie są wywoływane. Lub, właściwości fasoli nie są aktualizowane o przedstawione wartości UIInput.

Jakie są możliwe przyczyny i rozwiązania tego?

Author: Kukeltje, 2010-01-22

9 answers

Wprowadzenie

Gdy składnik UICommand (<h:commandXxx>, <p:commandXxx>, etc) nie wywołuje skojarzonej metody akcji, lub komponentu UIInput(<h:inputXxx>, <p:inputXxxx>, i nie widzisz żadnych googlowalnych wyjątków i / lub ostrzeżeń w dzienniku serwera, również nie wtedy, gdy skonfigurujesz obsługę wyjątków ajax zgodnie z obsługa wyjątków w żądaniach JSF ajax, ani gdy ustawisz poniżej parametr kontekstowy w JSF ajax requests . web.xml,

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

I nie widzisz żadnych błędów googlable i / lub ostrzeżeń w konsoli JavaScript przeglądarki (naciśnij F12 w Chrome / Firefox23 + / IE9+, aby otworzyć zestaw narzędzi dla programistów, a następnie otworzyć Console), a następnie przejrzyj poniższą listę możliwych przyczyn.

Możliwe przyczyny

  1. UICommand i UIInput komponenty muszą być umieszczone wewnątrz UIForm komponentu, np. <h:form> (a więc nie zwykły HTML <form>), w przeciwnym razie nic nie może być wysłane na serwer. UICommand komponenty również nie mogą mieć atrybutu type="button", w przeciwnym razie będzie to martwy przycisk, który jest przydatny tylko dla JavaScript onclick. Zobacz także jak wysłać wartości wejściowe formularza i wywołać metodę w JSF Bean i nie inicjuje postback.

  2. Nie można zagnieżdżać w sobie wielu UIForm komponentów. To jest nielegalne w HTML. Zachowanie przeglądarki jest nieokreślone. Uważaj z plikami nagłówkowymi! Możesz użyć UIForm komponenty równolegle, ale nie będą się przetwarzać podczas przesyłania. Powinieneś również uważać na antypattern "God Form"; upewnij się, że nie przetwarzasz/nie walidujesz wszystkich innych (niewidocznych) wejść w tej samej formie (np. mając ukryte okno dialogowe z wymaganymi wejściami w tej samej formie). Zobacz także jak używać na stronie JSF? Pojedyncza forma? Wiele formularzy? Zagnieżdżone formy?.

  3. Nie UIInput Błąd walidacji/konwersji wartości powinien mieć wystąpił. Możesz użyć <h:messages>, aby wyświetlić wszystkie wiadomości, które nie są wyświetlane przez żadne komponenty specyficzne dla wejścia <h:message>. Nie zapomnij umieścić id z <h:messages> w <f:ajax render>, jeśli w ogóle, tak, że będzie on aktualizowany również w żądaniach ajax. Patrz również H:messages nie wyświetla wiadomości, gdy naciśnięty jest przycisk P: commandButton.

  4. If UICommand lub UIInput komponenty są umieszczone wewnątrz komponentu iteracyjnego, jak <h:dataTable>, <ui:repeat>, itp., Następnie należy upewnić się, że dokładnie to samo value komponentu iteracyjnego został zachowany podczas fazy zastosuj wartości żądania formularza wyślij żądanie. JSF powtórzy nad nim, aby znaleźć kliknięty link / przycisk i przesłane wartości wejściowe. Umieszczenie fasoli w obszarze widoku i / lub upewnienie się, że załadujesz model danych w @PostConstruct fasoli (a więc nie w metodzie getter!) powinno to naprawić. Zobacz także jak i kiedy powinienem załadować model z bazy danych dla h: dataTable.

  5. If UICommand or UIInput komponenty są dołączane przez dynamiczne źródło, takie jak <ui:include src="#{bean.include}">, następnie należy upewnić się, że dokładnie ta sama wartość #{bean.include} jest zachowana podczas budowania widoku żądania przesłania formularza. JSF zrewiduje go podczas budowania drzewa komponentów. Umieszczenie fasoli w obszarze widoku i / lub upewnienie się, że załadujesz model danych w @PostConstruct fasoli (a więc nie w metodzie getter!) powinno to naprawić. Zobacz też Jak odświeżyć dynamiczną zawartość za pomocą menu nawigacyjnego? (JSF SPA) .

  6. Atrybut rendered komponentu i wszystkich jego rodziców oraz atrybut test dowolnego rodzica <c:if>/<c:when> nie należy oceniać do false podczas fazy zastosuj wartości żądania w formularzu wyślij żądanie. JSF sprawdzi to ponownie w ramach zabezpieczenia przed manipulowanymi/zhakowanymi żądaniami. Przechowywanie zmiennych odpowiedzialnych za warunek w @ViewScoped bean lub upewnienie się, że prawidłowo preinicjujesz warunek w {[29] } z @RequestScoped bean powinno naprawić to. To samo dotyczy atrybutu disabled komponentu, który nie powinien być oceniany na true podczas fazy apply request values. Patrz również JSF Komenda nie wywołana i formularz submit w warunkowo renderowanym komponencie nie jest przetwarzany .

  7. Atrybut onclick składnika UICommand i atrybut onsubmit składnika UIForm nie powinny zwracać false ani powodować błędu JavaScript. Powinno być w przypadku <h:commandLink> lub <f:ajax> również nie ma błędów JS widocznych w konsoli js przeglądarki. Zwykle googling dokładny komunikat o błędzie daje już odpowiedź. Zobacz także dodanie jQuery do PrimeFaces powoduje, że TypeError nie jest ustawiony na wszystkie miejsca.

  8. Jeśli używasz Ajax przez JSF 2.x <f:ajax> lub np. PrimeFaces <p:commandXxx>, Upewnij się, że masz <h:head> w szablonie głównym zamiast <head>. W przeciwnym razie JSF nie będzie mógł automatycznie dołączać niezbędnych plików JavaScript, które zawierają Ajax funkcje. Spowoduje to błąd JavaScript, taki jak "mojarra nie jest zdefiniowana" lub "PrimeFaces nie jest zdefiniowana"w konsoli js przeglądarki. Zobacz także h: commandLink actionlistener nie jest wywoływany, gdy jest używany z F: ajax i UI: repeat.

  9. Jeśli używasz Ajaxu, upewnij się, że interesujące Składniki UIInput i UICommand są objęte <f:ajax execute> lub np. <p:commandXxx process>, w przeciwnym razie nie będą wykonywane/przetwarzane. Zobacz również wartości formularza Nie aktualizowane w modelu podczas dodawania do i zrozumienie primefaces process/update i JSF f:Ajax execute/render atrybuty.

  10. Jeśli rodzic {[11] } Z Przyciskiem UICommand jest wcześniej renderowany/aktualizowany przez żądanie ajax pochodzące z innego formularza na tej samej stronie, to pierwsza akcja zawsze się nie powiedzie. Drugie i kolejne działania będą działać. Jest to spowodowane błędem obsługi stanu widoku, który jest zgłaszany jako problem ze specyfikacją JSF 790 i obecnie planowane do naprawy w JSF 2.3. W przypadku starszych wersji JSF należy jawnie podać ID <h:form> w render <f:ajax>. Zobacz też h:commandButton/h:commandLink nie działa przy pierwszym kliknięciu, działa tylko przy drugim kliknięciu .

  11. Jeśli <h:form> ma enctype="multipart/form-data" ustawione w celu obsługi przesyłania plików, musisz się upewnić, że używasz co najmniej JSF 2.2, lub że filtr servleta, który jest odpowiedzialny za parsowanie multipart / form-data requests jest poprawnie skonfigurowany, w przeciwnym razie FacesServlet nie otrzyma żadnych parametrów żądania i tym samym nie będzie mógł zastosować wartości żądania. Sposób skonfigurowania takiego filtra zależy od używanego komponentu przesyłania plików. Dla Tomahawk <t:inputFileUpload>, sprawdź ta odpowiedź i dla PrimeFaces <p:fileUpload>, sprawdź ta odpowiedź. Lub, jeśli faktycznie nie przesyłasz pliku w ogóle, Usuń atrybut całkowicie.

  12. Upewnij się, że argument ActionEvent z actionListener jest javax.faces.event.ActionEvent, a więc nie java.awt.event.ActionEvent, co większość Idów sugeruje jako pierwszą opcję autouzupełniania. Brak argumentów jest również błędny, jeśli używasz actionListener="#{bean.method}". Jeśli nie chcesz argumentu w swojej metodzie, użyj actionListener="#{bean.method()}". A może chcesz użyć action zamiast actionListener. Zobacz także różnice między działaniem a actionListener .

  13. Upewnij się, że żaden PhaseListener lub jakikolwiek EventListener w łańcuchu żądania-odpowiedzi nie zmienił cyklu życia JSF aby pominąć fazę wywołania akcji, na przykład wywołując FacesContext#renderResponse() lub FacesContext#responseComplete().

  14. Upewnij się, że żaden Filter lub Servlet w tym samym łańcuchu odpowiedzi na żądanie nie zablokował żądania FacesServlet.

  15. Błąd w frameworku. Na przykład, RichFaces ma " błąd konwersji " podczas używania elementu UI rich:calendar z atrybutem defaultLabel (lub, w niektórych przypadkach, podelementu rich:placeholder). Ten błąd uniemożliwia wywołanie metody bean, gdy żadna wartość nie jest Ustaw datę w kalendarzu. Śledzenie błędów frameworku można wykonać, zaczynając od prostego przykładu roboczego i budując kopię zapasową strony aż do wykrycia błędu.

  16. Jeśli używasz PrimeFaces p:dialog lub p:overlayPanel, upewnij się, że nie uruchamiasz p:akcja commandbutton nie działa wewnątrz okna p:

Wskazówki debugowania

W przypadku, gdy nadal się zacinasz, nadszedł czas na debugowanie. Po stronie klienta naciśnij F12 w webbrowserze, aby otwórz zestaw narzędzi web developer. Kliknij kartę Console, aby zobaczyć conosle JavaScript. Powinien być wolny od błędów JavaScript. Poniżej znajduje się przykład z Chrome, który demonstruje przypadek wysłania włączonego przycisku <f:ajax> bez zadeklarowania <h:head> (jak opisano w punkcie 7 powyżej).

konsola js

Kliknij kartę Network , aby wyświetlić Monitor ruchu HTTP. Prześlij formularz i sprawdź, czy nagłówki żądania i dane formularza i organ odpowiedzi są zgodne z oczekiwaniami. Poniżej zrzut ekranu jest przykład z Chrome, który demonstruje udane przesłanie ajax prostego formularza z pojedynczym <h:inputText> i pojedynczym <h:commandButton> z <f:ajax execute="@form" render="@form">.

Monitor sieci

(ostrzeżenie: gdy publikujesz zrzuty ekranu z nagłówków żądań HTTP, jak powyżej, ze środowiska produkcyjnego, upewnij się, że szyfrujesz / zaciemniasz pliki cookie sesji na zrzucie ekranu, aby uniknąć przechwytywania sesji ataki!)

Po stronie serwera upewnij się, że serwer jest uruchomiony w trybie debugowania. Umieść debug breakpoint w metodzie interesującego komponentu JSF, którą spodziewasz się wywołać podczas przetwarzania formularza submit. Np. w przypadku UICommand składnika, który byłby UICommand#queueEvent() i w przypadku UIInput składnika, który byłby UIInput#validate(). Wystarczy przejść przez wykonanie kodu i sprawdzić, czy przepływ i zmienne są zgodne z oczekiwaniami. Poniżej zrzut ekranu jest przykład z debuggera Eclipse.

serwer debugowania

 641
Author: BalusC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-01 10:32:07

Jeśli twoje h:commandLink znajduje się wewnątrz h:dataTable, istnieje inny powód, dla którego łącze polecenia h:może nie działać:

Podstawowe źródło danych, które jest związane z h:dataTable musi być również dostępne w drugim cyklu życia JSF, który jest uruchamiany po kliknięciu łącza.

Więc jeśli źródłem danych jest request scoped, h:commandLink nie działa!

 51
Author: jbandi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-08 22:25:06

Chociaż moja odpowiedź nie jest w 100% odpowiednia, ale większość wyszukiwarek uważa to za pierwszy hit, postanowiłem ją opublikować bez końca:

Jeśli używasz PrimeFaces (lub podobnego API) p:commandButton LUB p:commandLink, prawdopodobnie zapomniałeś dodać process="@this" do swoich komponentów poleceń.

Jak stwierdza Przewodnik Użytkownika PrimeFaces w sekcji 3.18, wartości domyślne dla process i update są obie @form, co w zasadzie sprzeciwia się wartościom domyślnym, których można oczekiwać od zwykłego JSF f:ajax lub RichFaces, które są odpowiednio execute="@this" i render="@none".

Zajęło mi trochę czasu, żeby się dowiedzieć. (... a ja myślę, że to raczej unclever używać domyślnych, które różnią się od JSF!)
 25
Author: Kawu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-06 12:55:01

Chciałbym wspomnieć jeszcze jedną rzecz, która dotyczy Primefaces p:commandButton!

Kiedy używasz p:commandButton do akcji, która musi być wykonana na serwerze, nie możesz użyć type="button", ponieważ jest to dla przycisków, które są używane do wykonywania niestandardowego javascript bez powodowania żądania ajax/non-ajax do serwera.

W tym celu możesz zrezygnować z atrybutu type (domyślną wartością jest "submit") lub jawnie użyć type="submit".

Mam nadzieję, że to komuś pomoże!

 9
Author: akelec,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-03 19:15:10

Ostatnio natknąłem się na problem z UICommand nie wywołujący w aplikacji JSF 1.2 używającej komponentów IBM Extended Faces.

Miałem przycisk polecenia w wierszu datatable (rozszerzona wersja, więc <hx:datatable>) i UICommand nie będzie strzelać z niektórych wierszy z tabeli(wiersze, które nie będą strzelać były wiersze większe niż domyślny rozmiar wyświetlania wierszy).

Miałem komponent rozwijany do wybierania liczby wierszy do wyświetlenia. Wartość tego pola była w RequestScope. Dane wspierające samą tabelę były w rodzaju ViewScope (w rzeczywistości tymczasowo w SessionScope).

Jeśli wyświetlanie wiersza zostało zwiększone za pomocą kontrolki, która wartość była również powiązana z atrybutem datatable rows, żaden z wierszy wyświetlanych w wyniku tej zmiany nie mógł uruchomić UICommand po kliknięciu.

Umieszczenie tego atrybutu w tym samym zakresie co Dane tabeli rozwiązało problem.

Myślę, że jest to aluzja do BalusC #4 powyżej, ale nie tylko wartość tabeli musi być Widok lub zakres sesji, ale także atrybut kontrolujący liczbę wierszy do wyświetlenia w tej tabeli.

 3
Author: Brent C,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-13 18:23:29

Utknąłem z tym problemem i znalazłem jeszcze jedną przyczynę tego problemu. Jeśli nie masz metod setera w fasoli podkładowej dla właściwości użytych w Twoim *.xhtml, wtedy akcja po prostu nie jest wywoływana.

 2
Author: Syed Mehtab,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-23 10:55:59

Miałem ten problem, jak również i naprawdę zaczął doskonalić się w sprawie głównej przyczyny po otwarciu konsoli internetowej przeglądarki. Do tego czasu nie byłem w stanie uzyskać żadnych komunikatów o błędach (nawet z <p:messages>). Konsola internetowa pokazała kod statusu HTTP 405 pochodzący z <h:commandButton type="submit" action="#{myBean.submit}">.

W moim przypadku mam mieszankę waniliowego Httpservleta zapewniającego uwierzytelnianie OAuth poprzez Auth0 i JSF facelets and beans wykonujących moje widoki aplikacji i logikę biznesową.

Kiedy refakturowałem moje www.xml, i usunął middle-man-servlet, to wtedy" magicznie " działa.

Podsumowując, problem polegał na tym, że środkowy servlet używał RequestDispatcher.naprzód(...) przekierowanie ze środowiska HttpServlet do środowiska JSF, podczas gdy wywołany wcześniej servlet był przekierowywany za pomocą HttpServletResponse.sendRedirect(...).

Zasadniczo, użycie sendredirect () pozwoliło "kontenerowi" JSF przejąć kontrolę, podczas gdy RequestDispatcher.forward () było oczywiście nie.

Nie wiem, dlaczego facelet był w stanie uzyskać dostęp do właściwości fasoli, ale nie mógł ich ustawić, a to wyraźnie krzyczy o pozbycie się mieszanki servletów i JSF, ale mam nadzieję, że to pomoże komuś uniknąć wielu godzin uderzania głową w stół.

 2
Author: Brooks,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-11 16:11:51

Miałem dużo zabawy debugowania problem gdzie <h:commandLink> ' s akcja w richfaces datatable odmówił strzału. Stół kiedyś pracował w pewnym momencie, ale zatrzymał się bez wyraźnego powodu. Nie zostawiłem kamienia na odwrocie, tylko po to, aby dowiedzieć się, że mój rich:datatable używał niewłaściwego rowKeyConverter, który zwrócił null, którego richfaces szczęśliwie używał jako kluczy wiersza. To uniemożliwiło wywołanie mojej <h:commandLink> akcji.

 0
Author: Mustafa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-02 19:06:38

Jeszcze jedna możliwość: jeśli objawem jest to, że pierwsze wywołanie działa, ale kolejne nie, możesz używać PrimeFaces 3.x z JSF 2.2, jak opisano tutaj: nie jest wysyłany ViewState .

 0
Author: Dave Mulligan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-17 22:22:41