commandButton / commandLink / ajaxアクション/リスナーメソッドが呼び出されていないか、入力値が設定/更新されていません

351
Muhammad Hewedy 2010-01-23 06:18.

時々 、使用時<h:commandLink><h:commandButton>または<f:ajax>actionactionListenerまたはlistenerタグに関連付けられた方法は、単に起動されていません。または、Beanプロパティが送信されたUIInput値で更新されません。

これの考えられる原因と解決策は何ですか?

9 answers

696
BalusC 2010-01-23 10:13.

前書き

たびUICommand成分(<h:commandXxx><p:commandXxx>など)に関連するアクションメソッド、または起動に失敗したUIInputコンポーネントを(<h:inputXxx><p:inputXxxx>など)提出された値を処理および/またはモデル値の更新に失敗し、あなたはどんなgooglable例外が表示されない、および/またはサーバーログの警告。JSFajaxリクエストの例外処理に従ってajax例外ハンドラーを構成した場合や、で以下のコンテキストパラメーターを設定した場合もweb.xml同様です。

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

また、ブラウザのJavaScriptコンソールにグーグル可能なエラーや警告が表示されない場合(Chrome / Firefox23 + / IE9 +でF12を押して、Web開発者ツールセットを開き、[コンソール]タブを開きます)、考えられる原因の以下のリストを確認します。

考えられる原因

  1. UICommandおよびUIInput部品の内側に配置する必要がありますUIForm例えば、コンポーネント<h:form>(プレーンHTMLをひいてはいない<form>)、それ以外は何もサーバーに送信することはできません。UICommandコンポーネントにもtype="button"属性があってはなりません。そうでない場合、JavaScriptでのみ役立つデッドボタンになりますonclick。参照してフォームの入力値を送信する方法とJSF Bean内のメソッドを呼び出すと<H:コマンドボタンを>ポストバックを開始しません。

  2. 複数のUIFormコンポーネントを相互にネストすることはできません。これはHTMLでは違法です。ブラウザの動作は指定されていません。インクルードファイルに気をつけてください!UIFormコンポーネントは並行して使用できますが、送信時に相互に処理されません。また、「GodForm」アンチパターンにも注意する必要があります。まったく同じ形式の他のすべての(非表示の)入力を意図せずに処理/検証しないようにしてください(たとえば、まったく同じ形式の必要な入力を含む非表示のダイアログがある場合)。JSFページで<h:form>を使用する方法も参照してください。単一のフォーム?複数のフォーム?ネストされたフォーム?。

  3. いいえUIInput値の検証/変換エラーが発生していないはずです。<h:messages>入力固有の<h:message>コンポーネントによって表示されないメッセージを表示するために使用できます。含めることを忘れてはいけないidのを<h:messages>して<f:ajax render>、もしあれば、それは、AJAX要求にうまくとして更新されること。p:commandButtonが押されたときにh:messagesがメッセージを表示しないも参照してください。

  4. 場合UICommandUIInput部品には同じ反復処理コンポーネントの内側に配置されている<h:dataTable><ui:repeat>など、あなたがまったく同じことを確認する必要がありvalue反復処理コンポーネントの中に保存されているフォームの要求値適用フェーズは、リクエストを送信してください。JSFはそれを繰り返して、クリックされたリンク/ボタンと送信された入力値を見つけます。Beanをビュースコープに配置するか、データモデルを@PostConstructBeanにロードすることを確認する(したがって、getterメソッドではない)ことで修正されます。h:dataTableのデータベースからモデルをロードする方法とタイミングも参照してください。

  5. 場合UICommandUIInputコンポーネントがのようなダイナミックなソースによって含まれている<ui:include src="#{bean.include}">、あなたは正確に同じことを確認する必要があります#{bean.include}フォームのビュービルド時にリクエストを送信した値が保存されます。JSFは、コンポーネントツリーの構築中にそれを再実行します。Beanをビュースコープに配置するか、データモデルを@PostConstructBeanにロードすることを確認する(したがって、getterメソッドではない)ことで修正されます。ナビゲーションメニューで動的インクルードコンテンツをajax-refreshする方法も参照してください。(JSF SPA)。

  6. renderedコンポーネントとその親のすべての属性とtest任意の親の属性は、<c:if>/<c:when>に評価されてはならないfalseフォーム要求を提出の要求値の適用フェーズ中に。JSFは、改ざん/ハッキングされたリクエストに対する保護の一環として、それを再チェックします。条件の原因となる変数を@ViewScopedBeanに格納するか、Beanの条件を適切に事前初期化していることを確認する@PostConstructと、@RequestScoped修正されるはずです。同じことがコンポーネントの属性disabledreadonly属性にも当てはまります。これらは、trueリクエスト値の適用フェーズでは評価されません。参照してくださいJSFコマンドボタンアクションが呼び出されない、フォームは、コンポーネントが処理されない条件付きでレンダリングで提出し、<panelGroupは、レンダリング時間>私はそれをラップ後のcommandButtonが作動していません:hはとプロセス、検証および更新読み取り専用/無効の入力コンポーネントへの強制JSFとにかく

  7. コンポーネントのonclick属性とUICommandコンポーネントのonsubmit属性は、JavaScriptエラーをUIForm返しfalseたり引き起こしたりしてはなりません。ブラウザのJSコンソールにJSエラーが表示される場合、<h:commandLink>または<f:ajax>表示されない場合があります。通常、正確なエラーメッセージをグーグルで検索すると、すでに答えが得られます。PrimeFacesを使用してjQueryを手動で追加/ロードするとUncaughtTypeErrorsが発生するも参照してください。

  8. JSF 2.x<f:ajax>またはPrimeFaces<p:commandXxx>などを介してAjaxを使用している場合は<h:head>、マスターテンプレートに<head>。ではなくが含まれていることを確認してください。そうしないと、JSFはAjax関数を含む必要なJavaScriptファイルを自動インクルードできません。これにより、ブラウザのJSコンソールで「mojarraが定義されていません」または「PrimeFacesが定義されていません」などのJavaScriptエラーが発生します。関連項目h:commandLink actionlistenerは、f:ajaxおよびui:repeatとともに使用された場合は呼び出されません。

  9. Ajaxを使用していて、送信された値が最終的にになる場合は、対象のコンポーネントとコンポーネントがまたはなどでカバーされてnullいることを確認してください。カバーされていない場合、それらは実行/処理されません。<f:ajax>を<h:commandButton>に追加するときにモデルで更新されない送信済みフォーム値およびPrimeFacesプロセス/更新とJSF f:ajax実行/レンダリング属性についても参照してください。UIInputUICommand<f:ajax execute><p:commandXxx process>

  10. 送信された値がまだでありnull、CDIを使用してBeanを管理している場合は、スコープアノテーションを正しいパッケージからインポートするようにしてください。そうしないと、CDIがデフォルトになり@Dependent、ELのすべての評価でBeanが効果的に再作成されます。式。@SessionScoped Beanもスコープを失い、常に再作成され、フィールドがnullになり、JSF 2アプリケーションのデフォルトのマネージドBeanスコープは何ですか?も参照してください。

  11. ボタン<h:form>付きのの親が、UICommand同じページの別のフォームからのajaxリクエストによって事前にレンダリング/更新されている場合、JSF2.2以前では最初のアクションは常に失敗します。2番目以降のアクションは機能します。これは、JSF仕様の問題790として報告され、現在JSF2.3で修正されているビューステート処理のバグが原因で発生します。古いJSFのバージョンでは、明示的にIDを指定する必要が<h:form>render<f:ajax>。h:commandButton / h:commandLinkも参照してください。最初のクリックでは機能せず、2回目のクリックでのみ機能します。

  12. 場合<h:form>しているenctype="multipart/form-data"サポートファイルのアップロードするために設定され、その後、あなたは、そうでない場合は、少なくともJSF 2.2を使用して、またはマルチパート/フォームデータ要求を解析するための責任があるサーブレットフィルタが正しく設定されていることをしていることを確認する必要がありFacesServlet意志を最終的にリクエストパラメータがまったく取得されないため、リクエスト値を適用できなくなります。このようなフィルターを構成する方法は、使用されているファイルアップロードコンポーネントによって異なります。トマホークの<t:inputFileUpload>場合はこの回答を確認し、PrimeFacesの<p:fileUpload>場合はこの回答を確認してください。または、実際にファイルをまったくアップロードしていない場合は、属性を完全に削除します。

  13. ActionEvent引数がactionListenerでありjavax.faces.event.ActionEvent、したがってではないことを確認してくださいjava.awt.event.ActionEvent。これは、ほとんどのIDEが最初のオートコンプリートオプションとして提案していることです。を使用する場合、引数がないことも間違っていますactionListener="#{bean.method}"。メソッドに引数が必要ない場合は、を使用しますactionListener="#{bean.method()}"。または、実際にのaction代わりに使用したい場合もありactionListenerます。actionとactionListenerの違いも参照してください。

  14. 要求/応答チェーンのPhaseListenerいずれかEventListenerがJSFライフサイクルを変更していないことを確認し、たとえば、FacesContext#renderResponse()またはを呼び出して、アクションの呼び出しフェーズをスキップしますFacesContext#responseComplete()

  15. 何らかの理由でリクエストをブロックしていないFilterServlet、同じリクエスト-レスポンスチェーン内にあることを確認してくださいFacesServlet。たとえば、SpringSecurityなどのログイン/セキュリティフィルター。特にajaxリクエストでは、デフォルトではUIフィードバックがまったく表示されません。Spring Security4およびPrimeFaces5AJAXリクエスト処理も参照してください。

  16. PrimeFaces<p:dialog>またはを使用<p:overlayPanel>している場合は、それらに独自のが含まれていることを確認してください<h:form>。なぜなら、これらのコンポーネントはデフォルトでJavaScriptによってHTMLの最後に再配置されるから<body>です。したがって、元々がの中に座っていた<form>場合、今ではもう座っていません<form>。p:commandbuttonアクションがp:dialog内で機能しないも参照してください。

  17. フレームワークのバグ。たとえば、属性(または場合によってはサブ要素)を持つUI要素を使用すると、RichFacesに「変換エラー」が発生します。このバグにより、カレンダーの日付に値が設定されていない場合にBeanメソッドが呼び出されなくなります。フレームワークのバグの追跡は、簡単な実例から始めて、バグが発見されるまでページをバックアップすることで実現できます。rich:calendardefaultLabelrich:placeholder

デバッグのヒント

それでも問題が解決しない場合は、デバッグする必要があります。クライアント側で、webbrowserのF12を押して、Web開発者ツールセットを開きます。[コンソール]タブをクリックして、JavaScriptコンソールを確認します。JavaScriptエラーがないはずです。以下のスクリーンショットは、(上記のポイント7で説明したように)宣言<f:ajax>していないときに有効なボタンを送信する場合を示すChromeの例<h:head>です。

[ネットワーク]タブをクリックして、HTTPトラフィックモニターを表示します。フォームを送信し、リクエストヘッダー、フォームデータ、およびレスポンスの本文が期待どおりかどうかを調査します。スクリーンショットの下には成功したアヤックスは、単一でシンプルなフォームの提出を示してChromeからの例で<h:inputText>、シングル<h:commandButton><f:ajax execute="@form" render="@form">

(警告:本番環境から上記のようなHTTPリクエストヘッダーからスクリーンショットを投稿する場合は、セッションハイジャック攻撃を回避するために、スクリーンショット内のセッションCookieをスクランブル/難読化してください!)

サーバー側で、サーバーがデバッグモードで起動されていることを確認します。フォーム送信の処理中に呼び出されると予想される対象のJSFコンポーネントのメソッドにデバッグブレークポイントを設定します。たとえば、UICommandコンポーネントの場合はそうなりUICommand#queueEvent()UIInputコンポーネントの場合はそうなりますUIInput#validate()。コードの実行をステップスルーし、フローと変数が期待どおりかどうかを調べます。以下のスクリーンショットは、Eclipseのデバッガーの例です。

55
jbandi 2010-11-09 12:25.

あなたh:commandLinkが中にいる場合、が機能h:dataTableh:commandLinkないかもしれない別の理由があります:

にバインドされている基になるデータソースはh:dataTable、リンクがクリックされたときにトリガーされる2番目のJSFライフサイクルでも使用可能である必要があります。

したがって、基になるデータソースがリクエストスコープの場合、h:commandLinkは機能しません。

29
Kawu 2013-01-04 08:51.

私の答えは100%当てはまるわけではありませんが、ほとんどの検索エンジンはこれを最初のヒットと見なしていますが、それでも投稿することにしました。

あなたが使用している場合はPrimeFaces(またはいくつかの同様のAPIを)p:commandButtonまたはp:commandLink、チャンスはあなたが明示的に追加することを忘れているということであるprocess="@this"コマンド・コンポーネントに。

PrimeFacesユーザーズガイドは、セクション3.18に述べているように、のデフォルトprocessupdateともに@form、かなりあなたは普通のJSFから期待するかもしれないデフォルト対向する、f:ajaxまたはあるRichFacesの、execute="@this"そしてrender="@none"それぞれを。

見つけるのにかなりの時間がかかりました。(...そしてJSFとは異なるデフォルトを使用するのはかなり賢くないと思います!)

9
akelec 2015-01-04 09:15.

Primefacesに関係するもう1つのことを述べておきp:commandButtonます!

p:commandButtonサーバーで実行する必要のあるアクションにを使用する場合、サーバーにajax / non-ajaxリクエストを発生させずにカスタムJavaScriptを実行するために使用されるプッシュボタンのtype="button"ために使用することはできません。

この目的のために、type属性をディスペンスする"submit"か(デフォルト値は)、明示的に使用することができますtype="submit"

これが誰かを助けることを願っています!

3
Dnavir 2013-02-24 00:55.

自分でこの問題に悩まされ、この問題のもう1つの原因を見つけました。* .xhtmlで使用されるプロパティのsetterメソッドがバッキングBeanにない場合、アクションは単に呼び出されません。

3
Brent C 2015-10-14 08:23.

最近、IBM ExtendedFacesコンポーネントを使用してJSF1.2アプリケーションでUICommandが呼び出されないという問題が発生しました。

データテーブルの行にコマンドボタンがあり(拡張バージョンなど<hx:datatable>)、UICommandはテーブルの特定の行から起動しませんでした(起動しない行はデフォルトの行表示サイズよりも大きい行でした)。

表示する行数を選択するためのドロップダウンコンポーネントがありました。このフィールドを裏付ける値はにありましたRequestScope。テーブル自体を裏付けるデータは、ある種のものでしたViewScope(実際には、一時的にSessionScope)。

どの値もdatatableのrows属性にバインドされているコントロールを介して行の表示が増加した場合、この変更の結果として表示された行は、クリックされたときにUICommandを起動できませんでした。

この属性をテーブルデータ自体と同じスコープに配置すると、問題が修正されました。

これは上記のBalusC#4でほのめかされていると思いますが、テーブルの値はViewまたはSessionスコープである必要があるだけでなく、そのテーブルに表示する行数を制御する属性も必要でした。

2
Brooks 2017-04-12 06:11.

私もこの問題を抱えていて、ブラウザのWebコンソールを開いた後、根本的な原因に焦点を合わせ始めました。それまでは、(を使用しても<p:messages>)エラーメッセージを受け取ることができませんでした。Webコンソールに、から戻ってきたHTTP405ステータスコードが表示されました<h:commandButton type="submit" action="#{myBean.submit}">

私の場合、Auth0とJSFのフェイスレットを介してOAuth認証を提供するバニラHttpServletと、アプリケーションビューとビジネスロジックを実行するBeanが混在しています。

web.xmlをリファクタリングし、仲介者サーブレットを削除すると、「魔法のように」機能しました。

結論として、問題は、ミドルマンサーボレットがRequestDispatcher.forward(...)を使用してHttpServlet環境からJSF環境にリダイレクトしているのに対し、それ以前に呼び出されていたサーブレットはHttpServletResponse.sendRedirect(.. 。)。

基本的に、sendRedirect()を使用すると、JSFの「コンテナ」が制御できるようになりましたが、RequestDispatcher.forward()は明らかにそうではありませんでした。

ファセットがBeanプロパティにアクセスできたのに設定できなかった理由はわかりません。これは、サーブレットとJSFの組み合わせを廃止することを明確に叫びますが、これが誰かが何時間もの頭を避けるのに役立つことを願っています- to-table-banging。

1
Mustafa 2017-05-03 09:06.

<h:commandLink>のアクションがrichfaces datatable起動を拒否する問題をデバッグするのはとても楽しかったです。テーブルはある時点で機能していましたが、明らかな理由もなく停止しました。私は石を回転させずに残しませんでしたが、リッチフェイスが行キーとして喜んで使用するnullを返すrich:datatable間違ったrowKeyConverterものを使用していることがわかりました。これにより、私の<h:commandLink>アクションが呼び出されなくなりました。

0
Dave Mulligan 2017-08-18 12:22.

もう1つの可能性:最初の呼び出しが機能するが、後続の呼び出しは機能しないという症状がある場合は、ここで詳しく説明するように、JSF2.2でPrimeFaces3.xを使用している可能性があります。ViewStateは送信されません。

Related questions

MORE COOL STUFF

ケイト・ブランシェットは3日間一緒に夫と一緒に寝て、25年経ってもまだ夫と結婚しています

ケイト・ブランシェットは3日間一緒に夫と一緒に寝て、25年経ってもまだ夫と結婚しています

ケイト・ブランシェットは、夫に会ったとき、典型的な交際のアドバイスに逆らいました。

マイケルシーンが非営利の俳優である理由

マイケルシーンが非営利の俳優である理由

マイケルシーンは非営利の俳優ですが、それは正確にはどういう意味ですか?

ホールマークスターのコリンエッグレスフィールドがRomaDramaLiveでスリル満点のファンと出会う![エクスクルーシブ]

ホールマークスターのコリンエッグレスフィールドがRomaDramaLiveでスリル満点のファンと出会う![エクスクルーシブ]

特徴的なスターのコリン・エッグレスフィールドは、RomaDrama Liveでのスリル満点のファンとの出会いについて料理しました!加えて、大会での彼のINSPIREプログラム。

「たどりつけば」をオンラインでストリーミングできない理由

「たどりつけば」をオンラインでストリーミングできない理由

ノーザンエクスポージャーが90年代の最も人気のある番組の1つになった理由を確認するには、Blu-rayまたはDVDプレーヤーをほこりで払う必要があります。

バイオニック読書はあなたをより速く読むことができますか?

バイオニック読書はあなたをより速く読むことができますか?

BionicReadingアプリの人気が爆発的に高まっています。しかし、それは本当にあなたを速読術にすることができますか?

ドミニカのボイリング湖:アクセスは簡単ではありませんが、ハイキングする価値があります

ドミニカのボイリング湖:アクセスは簡単ではありませんが、ハイキングする価値があります

ドミニカのボイリング湖は、世界で2番目に大きいボイリング湖です。そこにたどり着くまでのトレッキングは大変で長いですが、努力する価値は十分にあります。

私たちの水をきれいに保つのを助けるためにあなたの髪を寄付してください

私たちの水をきれいに保つのを助けるためにあなたの髪を寄付してください

サロンからのヘアトリミングや個人的な寄付は、油流出を吸収して環境を保護するのに役立つマットとして再利用できます。

ホワイトハウスの最も記憶に残る結婚式を見てください

ホワイトハウスの最も記憶に残る結婚式を見てください

過去200年以上の間にホワイトハウスで結婚したのはほんの数人です。彼らは誰でしたか、そしてそこで結婚式を獲得するために何が必要ですか?

この太陽に優しいショルダーバッグで一日中外出してください

この太陽に優しいショルダーバッグで一日中外出してください

画像クレジット:Richard Mackney / Flickrトラベリングライトは必需品だけを運ぶことを意味するかもしれませんが、デバイスを補充する方法がない外出先では、接続を維持するのが難しくなる可能性があります。それはあなたがすべての生き物の快適さやクールなガジェットを捨てる必要があるという意味ではありません、ただあなたがいくつかのより小さなものを手に入れる必要があるということです、そしておそらくあなた自身をジュースに保つためにいくつかの、例えば非正統的な充電装置を使うでしょう。

ミッドセンチュリーリゾートのポストカードが廃墟に変わるのを見る

ミッドセンチュリーリゾートのポストカードが廃墟に変わるのを見る

ニューヨーク州スプリンググレンにある放棄されたホモワックロッジのボーリング場。キャッツキル南部のこの地域は、ニューヨーク市からのユダヤ人の行楽客に人気があることから、かつてはボルシチベルトとして知られていました。

ブルックリンスレートの美しいボードをあなたのテーブルに座らせましょう

ブルックリンスレートの美しいボードをあなたのテーブルに座らせましょう

ブルックリンスレートブルックリンスレートのマグカップとコースターの賞賛をすでに歌っており、それらの食器製品も同様に堅実です。ブルックリンスレートは、さまざまなサイズとテクスチャのスレートの完全な採石場を販売しています。一部のオプションは赤でも利用できます。上で見ることができるように、彼らは同様にカスタマイズをします。

遺伝子分析により、私たちの体内に生息する微生物の99%がカタログ化されていないことが明らかになりました

遺伝子分析により、私たちの体内に生息する微生物の99%がカタログ化されていないことが明らかになりました

画像:Juan Gaertner / Shutterstock私たちの体の内部は、私たちの細胞とは何の関係もない何十億もの微生物が住んでいる本物の生態系です。これがまだ少し気になることではなかったかのように、これらの微生物の99%が研究されたことがないことがわかりました。

Zendaya Wishes Boyfriend Tom Holland Happy Birthday with Cuddly Photo: He 'Makes Me the Happiest'

Zendaya Wishes Boyfriend Tom Holland Happy Birthday with Cuddly Photo: He 'Makes Me the Happiest'

Zendaya shared a sweet photo in honor of boyfriend Tom Holland's 26th birthday Wednesday

小さな女性:脳卒中を患った後に病院から解放されたアトランタのジューシーな赤ちゃん:「まだ癒し」

小さな女性:脳卒中を患った後に病院から解放されたアトランタのジューシーな赤ちゃん:「まだ癒し」

シーレン「Ms.JuicyBaby」ピアソンは、先月脳卒中で入院した後、「もう一度たくさんのことをする方法を学ばなければならない」ため、言語療法を受けていることを明らかにしました。

エマストーンは彼女のクリフサイドマリブビーチハウスを420万ドルでリストアップしています—中を見てください!

エマストーンは彼女のクリフサイドマリブビーチハウスを420万ドルでリストアップしています—中を見てください!

オスカー受賞者の世紀半ばの家には、3つのベッドルーム、2つのバス、オーシャンフロントの景色があります。

ジーニー・メイ・ジェンキンスは、母乳育児の経験の中で、彼女は「本当に、本当に落ち込んでいる」と言います

ジーニー・メイ・ジェンキンスは、母乳育児の経験の中で、彼女は「本当に、本当に落ち込んでいる」と言います

ジーニー・メイ・ジェンキンスは、生後4か月の娘、モナコに母乳育児をしていると語った。

投資ノート:Bioscout AU$300万シード

投資ノート:Bioscout AU$300万シード

Bioscoutは、農家を運転席に置くという使命を負っています。Artesian(GrainInnovate)やUniseedと並んで、最新のシードラウンドでチームを支援できることをうれしく思います。問題真菌症による重大な作物の損失は、農民にとって試練であることが証明されています。

リトルマーケットリサーチ1| 2022年のクイックグリンプス遠隔医療市場

リトルマーケットリサーチ1| 2022年のクイックグリンプス遠隔医療市場

遠隔医療は、パンデミック後の時代では新しいものではなく、時代遅れの分野でもありません。しかし、業界を詳しく見ると、需要と供給の強力な持続可能性と、米国で絶え間ない革命となる強力な潜在的成長曲線を示しています。

スタートアップ資金調達環境:タイのスタートアップエコシステムの次は何ですか?

スタートアップ資金調達環境:タイのスタートアップエコシステムの次は何ですか?

2021年は、世界的なベンチャーキャピタル(VC)の資金調達にとって記録的な年でした。DealStreetAsiaによると、東南アジアも例外ではなく、この地域では年間で記録的な25の新しいユニコーンが採掘されました。

ムーアの法則を超えて

ムーアの法則を超えて

計算に対する私たちの欲求とムーアの法則が提供できるものとの間には、指数関数的に増大するギャップがあります。私たちの文明は計算に基づいています—建築と想像力の現在の限界を超える技術を見つけなければなりません。

Language