commandButton / commandLink / ajax eylem / dinleyici yöntemi çağrılmaz veya giriş değeri ayarlanmadı / güncellendi

bazen, <h:commandLink> , <h:commandButton> veya <f:ajax> , action , actionListener veya listener etiketiyle ilişkili yöntem kullanıldığında çağrılmaz. Ya da, bean özellikleri sunulan UIInput değerleri ile güncellenir.

bunun olası nedenleri ve çözümleri nelerdir?

315
tarihinde sordu Kukeltje 2010-01-22 19:18:46
kaynak

9 ответов

giriş

bir UICommand bileşeni ( <h:commandXxx> , <p:commandXxx> , vb.) ilişkili eylem yöntemini veya UIInput bileşenini ( <h:inputXxx> , <p:inputXxxx> , vb.) çağırmayı başaramadığında , gönderilen değerleri işleyemez ve/veya model değerlerini güncelleyemez ve sunucu günlüğünde herhangi bir googlable özel durum ve/veya uyarı görmezsiniz. ' özel durum işleme JSF ajax istekleri , web.xml ,

bağlam parametresinin altında ayarladığınızda ne de
<context-param>
    <param-name>javax.faces.PROJECT_STAGE</param-name>
    <param-value>Development</param-value>
</context-param>

ve ayrıca tarayıcının JavaScript konsolunda (Chrome/Firefox23+/IE9+' da F12 tuşuna basarak web geliştirici araç setini açıp konsolunu sekmesini açmak için) herhangi bir googlable hatası ve/veya uyarı görmüyorsunuz, daha sonra olası nedenler listesinden çalışıyorsunuz.

olası nedenler

  1. UICommand ve UIInput bileşenleri bir UIForm bileşeni içine yerleştirilmelidir, örneğin <h:form> (ve böylece düz HTML <form> değil ), aksi takdirde hiçbir şey sunucuya gönderilebilir. UICommand bileşenleri de type="button" özniteliğine sahip olmamalıdır, aksi takdirde sadece JavaScript onclick için yararlı olan ölü bir düğme olacaktır . Ayrıca Bkz. form giriş değerlerini gönderme ve JSF bean'da bir yöntemi çağırma ve bir postback başlatmaz .

  2. birbirinize birden fazla UIForm bileşeni yerleştiremezsiniz. Bu HTML'de yasadışı. Tarayıcı davranışı belirtilmemiş. Dahil dosyaları ile dikkat! UIForm bileşenlerini paralel olarak kullanabilirsiniz, ancak gönderim sırasında birbirlerini işleyemezler. Ayrıca" Tanrı Formu " antipattern ile dikkat etmelisiniz; istemeden yapmadığınızdan emin olun aynı formdaki tüm diğer (görünmez) girdileri işlem/doğrulama(örn. aynı formda gerekli girişlerle gizli bir iletişim kutusu olması). Ayrıca Bkz. JSF sayfasında nasıl kullanılır? Tek form mu? Birden fazla form mu? İç içe geçmiş formlar mı? .

  3. No UIInput değer doğrulama / dönüşüm hatası oluşmalıdır. Herhangi bir girişe özgü <h:message> ile gösterilmeyen iletileri göstermek için <h:messages> kullanabilirsiniz bileşen. <f:ajax render> de id <h:messages> ' <f:ajax render> de eklemeyi unutmayın , böylece ajax isteklerinde de güncellenecektir. Ayrıca Bkz. h:P: commandButton basıldığında mesajlar görüntülenmez .

  4. UICommand veya UIInput bileşenleri <h:dataTable> , <ui:repeat> , vb. gibi yinelenen bir bileşen içine yerleştirilirse, tam olarak aşağıdaki bileşenlerden emin olmanız gerekir yineleme bileşeninin aynı value form gönderme isteğinin başvuru isteği değerleri aşamasında korunmuştur. JSF, tıklanan bağlantıyı/düğmesini ve gönderilen giriş değerlerini bulmak için tekrar edecektir. Fasulyeyi görünüm kapsamına koymak ve / veya veri modelini fasulye @PostConstruct ye yüklediğinizden emin olmak (ve böylece bir alıcı yönteminde değil!) bunu düzeltmek gerekir. Ayrıca Bkz. H:dataTable için modeli veritabanından nasıl ve ne zaman yüklemeliyim .

  5. UICommand veya UIInput bileşenleri, <ui:include src="#{bean.include}"> gibi dinamik bir kaynak tarafından dahil edilirse, o zaman tam olarak aynı #{bean.include} değerinin, istek formunun görünüm oluşturma süresi boyunca korunduğundan emin olmanız gerekir. JSF, bileşen ağacını oluştururken yeniden hesaplar. Fasulyeyi görünüm kapsamına koymak ve / veya veri modelini fasulye @PostConstruct (ve böylece bir alıcı değil) ' ye yüklediğinizden emin olmak yöntem!) bunu düzeltmek gerekir. Ayrıca bakınız ajax-refresh dinamik navigasyon menüsü ile içerik dahil nasıl? (JSF SPA) .

  6. rendered bileşeni ve tüm anne ve test herhangi bir ebeveyn <c:if> / <c:when> özniteliği false için değerlendirmemelidir başvuru talebi formu gönderme isteği başvuru değerleri aşamasında. JSF karşı koruma parçası olarak yeniden kontrol edecek kurcalanmış / hacklenmiş istekler. @ViewScoped fasulyesindeki koşuldan sorumlu değişkenleri depolamak veya @RequestScoped fasulyesinin @PostConstruct daki durumu düzgün bir şekilde önceden yapılandırdığınızdan emin olmak bunu düzeltmelidir. Aynı 1519440920 ' uygulamak isteği değerler aşamasında değerlendirilmesi gereken bileşen disabled özniteliği için geçerlidir. Ayrıca Bkz. JSF CommandButton eylemi çağrılmaz ve formu koşullu olarak gönderilir işlenmiş bileşen işlenmez .

  7. onclick bileşeninin UICommand özniteliğinin ve onsubmit bileşeninin UIForm özniteliğinin false değerini döndürmemesi veya bir JavaScript hatasına neden olması gerekir. <h:commandLink> veya <f:ajax> durumunda da tarayıcının JS konsolunda görünür JS hataları olmamalıdır. Genellikle googling kesin hata mesajı zaten size cevap verecektir. Ayrıca bakınız PrimeFaces için jQuery ekleme her yerde üzerinde Uncaught TypeError sonuçlanır .

  8. JSF 2 üzerinden Ajax kullanıyorsanız.X <f:ajax> veya örneğin PrimeFaces <p:commandXxx> , <h:head> yerine ana şablonda <h:head> olduğundan emin olun . Aksi takdirde JSF Ajax işlevlerini içeren gerekli JavaScript dosyalarını otomatik olarak ekleyemez. Bu gibi bir JavaScript hatasına neden olur tarayıcının JS konsolunda" mojarra tanımlanmadı "veya" PrimeFaces tanımlanmadı". Ayrıca Bkz. h: F: ajax ve uı: repeat ile kullanıldığında commandLink actionlistener çağrılmaz .

  9. Ajax kullanıyorsanız, UIInput ve UICommand bileşenlerinin <f:ajax execute> veya <p:commandXxx process> ile kaplandığından emin olun, aksi takdirde idam / işlenmezler. Ayrıca Bkz. . form değerleri ve ekleyerek modelde güncelleştirilmez .Primefaces işlem/güncelleştirme ve JSF F:ajax execute/render öznitelikleri .

  10. <h:form> düğmesiyle <h:form> nin bir ebeveyni önceden aynı sayfadaki başka bir formdan gelen bir ajax isteği ile işlenmiş/güncellenmişse, ilk eylem her zaman başarısız olur. İkinci ve sonraki eylemler işe yarayacak. Bunun nedeni, JSF spec sorunu 790 olarak bildirilen ve şu anda JSF 2.3'de düzeltilmesi planlanan görünüm durumu işlemesinde bir hatadan kaynaklanmaktadır. Eski JSF sürümleri için açıkça <h:form> render <f:ajax> kimliği belirtmeniz gerekir . Ayrıca Bkz. h:commandButton/h:commandLink ilk tıklama çalışmaz, sadece ikinci tıklama üzerinde çalışır .

  11. , <h:form> dosya yüklenmesini desteklemek için enctype="multipart/form-data" setine sahipse, en az JSF 2.2 kullandığınızdan emin olmanız veya çoklu parça/form-veri isteklerini ayrıştırmaktan sorumlu olan servlet filtresinin düzgün bir şekilde yapılandırıldığından emin olmanız gerekir, aksi takdirde FacesServlet istek parametrelerini hiç almayacak ve böylece istek değerlerini uygulayamayacaktır. Böyle bir filtrenin nasıl yapılandırılacağı, kullanılan dosya yükleme bileşenine bağlıdır. Tomahawk İçin <t:inputFileUpload> , kontrol bu cevap ve PrimeFaces için <p:fileUpload> , kontrol bu cevap . Veya, aslında bir dosya yüklemiyorsanız, özniteliği tamamen kaldırın.

  12. , actionListener argümanının javax.faces.event.ActionEvent bir javax.faces.event.ActionEvent olduğundan ve dolayısıyla java.awt.event.ActionEvent olmadığından emin olun. Hiçbir argüman olması yanlış actionListener="#{bean.method}" kullanırsanız. Yönteminizde bir argüman istemiyorsanız, actionListener="#{bean.method()}" kullanın . Veya belki de actionListener yerine action kullanmak istersiniz. Ayrıca bakınız eylem ve actionListener Arasındaki Farklar .

  13. , PhaseListener veya EventListener talep yanıt zincirindeki herhangi bir EventListener , örneğin çağırma eylem aşamasını atlamak için JSF yaşam döngüsünü değiştirdi. FacesContext#renderResponse() veya FacesContext#responseComplete() .

  14. aynı istek-yanıt zincirinde Filter veya Servlet FacesServlet isteğini bir şekilde engellediğinden emin olun.

  15. hata çerçevesinde. Örneğin, RichFaces bir dönüştürme hatası " 1519850920 'UI öğesi defaultLabel özniteliği (veya bazı durumlarda, bir rich:placeholder alt eleman). Bu hata, takvim tarihi için hiçbir değer ayarlanmadığında fasulye yönteminin çağrılmasını engeller. İzleme çerçevesi hataları basit bir çalışma örneği ile başlayan ve hata keşfedilene kadar sayfayı geri inşa ederek gerçekleştirilebilir.

  16. bir PrimeFaces kullanıyorsanız p:dialog veya p:overlayPanel , p: commandbutton eylemi p:dialog içinde çalışmıyor

hata ayıklama ipuçları

hala stucks durumda, hata ayıklama zamanı. İstemci tarafında, Web geliştirici araç setini açmak için webbrowser'de F12'ye basın. Konsol sekmesini tıklayın, böylece JavaScript conosle'a bakın. Herhangi bir JavaScript hataları ücretsiz olmalıdır. Aşağıdaki ekran görüntüsü, <f:ajax> etkin bir düğme göndermenin durumunu gösteren Chrome'dan bir örnektir. <h:head> bildirilmedi (yukarıdaki nokta 7'de açıklandığı gibi).

js console

HTTP trafik monitörünü görmek için sekmesini tıklayın. Formu gönderin ve istek başlıklarının ve form verilerinin ve yanıt gövdesinin beklentilere göre olup olmadığını araştırın. Aşağıdaki ekran görüntüsü, basit bir formun başarılı bir ajax gönderimini gösteren Chrome'dan bir örnektir tek bir <h:inputText> ve tek bir <h:commandButton> ile <f:ajax execute="@form" render="@form"> .

network monitor

(uyarı: bir üretim ortamından yukarıdaki gibi HTTP istek başlıklarından ekran görüntüleri gönderdiğinizde, oturum kaçırma saldırılarını önlemek için ekran görüntüsündeki herhangi bir oturum çerezini karıştırdığınızdan/gizlediğinizden emin olun!)

Sunucu tarafında

, sunucunun hata ayıklama modunda başlatıldığından emin olun. Form gönderme işleme sırasında çağrılacak beklediğiniz ilgi JSF bileşeninin bir yöntemde bir hata ayıklama kesme noktası koyun. E. g. UICommand bileşeni olması durumunda, UICommand#queueEvent() ve UIInput bileşeni olması durumunda, UIInput#validate() . Kod yürütülmesine adım atmanız ve akışın ve değişkenlerin beklentilere göre olup olmadığını kontrol etmeniz yeterlidir. Aşağıda ekran görüntüsü Tutulma hata ayıklayıcısını bir örnektir.

debug server

641
cevap BalusC 2018-05-01 13:32:07
kaynak

eğer h:commandLink bir h:dataTable içinde ise H:commandlink'in işe yaramamasının başka bir nedeni var:

h:dataTable bağlı olan temel veri kaynağı, bağlantı tıklandığında tetiklenen ikinci JSF yaşam döngüsünde de kullanılabilir olmalıdır.

yani altta yatan veri kaynağı scoped değilse, h:commandLink çalışmıyor!

51
cevap jbandi 2010-11-09 01:25:06
kaynak

cevabım %100 geçerli olmasa da, çoğu arama motoru bunu ilk hit olarak buluyor, bunu olmayan bir şekilde yayınlamaya karar verdim:

1519120920 'PrimeFaces (veya bazı benzer API) p:commandButton veya p:commandLink kullanıyorsanız, process="@this" komut bileşenlerine açıkça process="@this" eklemeyi unutmuşsunuzdur.

Bölüm 3.18'de PrimeFaces Kullanıcı Kılavuzu durumları olarak, process varsayılanları ve update her ikisi de @form , bu da düz JSF f:ajax veya execute="@this" ve render="@none" olan RichFaces' dan beklediğiniz varsayılanlara karşı çıkıyor.

sadece öğrenmek için biraz zaman aldı. (... ve sanırım jsf'den farklı varsayılanları kullanmak oldukça unclever!)

25
cevap Kawu 2014-03-06 16:55:01
kaynak

Primefaces'in p:commandButton ile ilgili bir şey daha söyleyebilirim!

sunucuda yapılması gereken eylem için p:commandButton kullandığınızda, type="button" kullanamazsınız, çünkü için düğmeleri sunucuya ajax/ajax olmayan bir istek neden olmadan özel javascript yürütmek için kullanılır.

bu amaçla, type özniteliğini (varsayılan değer "submit" ) veya açıkça type="submit" kullanabilirsiniz .

umarım bu birine yardım eder!

9
cevap akelec 2015-01-03 22:15:10
kaynak

yakın zamanda IBM Extended Faces bileşenlerini kullanarak bir JSF 1.2 uygulamasında çağırmayan bir Uıcommand ile ilgili bir sorunla karşılaştım.

bir datatable (genişletilmiş sürüm, yani <hx:datatable> ) satırında bir komut düğmesi vardı ve uıcommand tablodan belirli satırlardan ateş etmemişti (ateş etmeyen satırlar, varsayılan satır görüntüleme boyutundan daha büyük satırlardı).

satır sayısını seçmek için bir açılır bileşen vardı Görüntüleme. Bu alanın değeri RequestScope idi . Tablonun kendisinin verileri bir çeşit ViewScope idi (gerçekte, geçici olarak SessionScope ).

satır görüntüsü, hangi değerin datatable rows özniteliğine de bağlı olduğu denetimle artarsa, bu değişikliğin sonucu olarak görüntülenen satırların hiçbiri uıcommand'ı tıklattığında ateşleyemez.

bu özniteliğin tablo verileri ile aynı kapsamda yerleştirilmesi kendisi sorunu çözdü.

bunun yukarıdaki BalusC #4'te ima edildiğini düşünüyorum, ancak yalnızca tablo değerinin görünümü veya oturumu taranması değil, aynı zamanda bu tabloda görüntülenecek satır sayısını kontrol eden öznitelik olması gerekiyordu.

3
cevap Brent C 2015-10-13 21:23:29
kaynak

bu konuyla kendim takıldım ve bu problem için bir neden daha buldum. *İçinde kullanılan özellikler için destek fasulye ayarlayıcı yöntemleri yoksa.XHTML, daha sonra eylem basitçe çağrılmaz.

2
cevap Syed Mehtab 2013-02-23 14:55:59
kaynak

ben de bu sorunu vardı ve sadece gerçekten tarayıcının web konsolunu açtıktan sonra kök nedeni bilemek başladı. Buna kadar, herhangi bir hata mesajı alamadım ( <p:messages> ile bile). Web konsolu, <h:commandButton type="submit" action="#{myBean.submit}"> dan geri gelen bir HTTP 405 durum kodu gösterdi .

benim durumumda, uygulama görünümlerimi ve işlerimi yürüten Auth0 ve JSF faselleri ve fasulye aracılığıyla oauth kimlik doğrulaması sağlayan vanilya Httpservlet'in bir karışımı var mantıksal.

webimi yeniden inceledikten sonra.xml ve bir orta adam-servlet kaldırıldı, daha sonra" sihirli " çalıştı.

alt satırda, sorun, orta-man-servlet'in RequestDispatcher kullanmasıydı.ileri.(..) httpservlet ortamından JSF ortamına yeniden yönlendirmek için servlet, HttpServletResponse ile yeniden yönlendirilirken önce çağrılır.sendRedirect(...).

temel olarak, sendRedirect() kullanarak RequestDispatcher kontrol altına almak için JSF "konteyner".ileri () açıkçası değildi.

bilmediğim şey, fasületin fasulye özelliklerine erişebilmesinin nedeni ancak bunları ayarlayamamasıdır ve bu, servlets ve JSF'NİN karışımı ile uzaklaşmak için açıkça çığlıklar atıyor, ancak umarım bu, birisinin saatlerce kafa kafaya çarpmaktan kaçınmasına yardımcı olur.

2
cevap Brooks 2017-04-11 19:11:51
kaynak

richfaces ' datatable bir <h:commandLink> eylem ateş reddetti bir sorun hata ayıklama eğlenceli bir sürü vardı. Tablo bir noktada çalışmak için kullanılan ama hiçbir belirgin nedeni durdu. Sadece rich:datatable nin richfaces'ın satır tuşları olarak mutlu bir şekilde kullandığı nulls'u döndüren yanlış rowKeyConverter kullandığını öğrenmek için, çevrilmemiş bir taş bırakmadım. Bu, <h:commandLink> eylemimin çağrılmasını engelledi.

0
cevap Mustafa 2017-05-02 22:06:38
kaynak

bir olasılık daha: Eğer belirti ilk çağrının işe yaradığı, ancak daha sonraki olanlar yapmazsa, PrimeFaces 3'ü kullanıyor olabilirsiniz.JSF 2.2 ile x, burada ayrıntılı olarak: hiçbir ViewState gönderilir .

0
cevap Dave Mulligan 2017-08-18 01:22:41
kaynak