時々 、使用時<h:commandLink>
、<h:commandButton>
または<f:ajax>
、action
、actionListener
またはlistener
タグに関連付けられた方法は、単に起動されていません。または、送信されたUIInput
値でBeanプロパティが更新されません。
これの考えられる原因と解決策は何ですか?
時々 、使用時<h:commandLink>
、<h:commandButton>
または<f:ajax>
、action
、actionListener
またはlistener
タグに関連付けられた方法は、単に起動されていません。または、送信されたUIInput
値でBeanプロパティが更新されません。
これの考えられる原因と解決策は何ですか?
回答:
たびUICommand
成分(<h:commandXxx>
、<p:commandXxx>
など)に関連するアクションメソッド、または起動に失敗したUIInput
コンポーネントを(<h:inputXxx>
、<p:inputXxxx>
など)提出された値を処理および/またはモデル値の更新に失敗し、あなたはどんなgooglable例外が表示されない、および/またはサーバーログの警告、JSF ajaxリクエストの例外処理に従って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開発者ツールセットを開き、[ コンソール ]タブを開く)場合は、以下の考えられる原因のリストに進んでください。
UICommand
およびUIInput
部品の内側に配置する必要がありますUIForm
例えば、コンポーネント<h:form>
(プレーンHTMLをひいてはいない<form>
)、それ以外は何もサーバーに送信することはできません。UICommand
コンポーネントもtype="button"
属性を持っていてはなりません。そうでなければ、それはJavaScriptにのみ役立つデッドボタンになりますonclick
。参照してフォームの入力値を送信する方法とJSF Bean内のメソッドを呼び出すと<H:コマンドボタンを>ポストバックを開始しません。
複数のUIForm
コンポーネントを互いにネストすることはできません。これはHTMLでは違法です。ブラウザの動作は規定されていません。インクルードファイルに注意してください!UIForm
コンポーネントを並行して使用できますが、送信中にコンポーネントが互いに処理することはありません。また、 "God Form"アンチパターンにも注意する必要があります。非常に同じフォームにある他のすべての(非表示)入力を誤って処理/検証しないようにしてください(たとえば、非常に同じフォームに必要な入力がある非表示ダイアログがある)。JSFページで<h:form>を使用する方法も参照してください。シングルフォーム?複数のフォーム?ネストされたフォーム?。
UIInput
値の検証/変換エラーは発生しません。を使用<h:messages>
して、入力固有の<h:message>
コンポーネントでは表示されないメッセージを表示できます。含めることを忘れてはいけないid
のを<h:messages>
して<f:ajax render>
、もしあれば、それは、AJAX要求にうまくとして更新されること。p:commandButtonが押されたときにh:messagesがメッセージを表示しないことも参照してください。
場合UICommand
やUIInput
部品には同じ反復処理コンポーネントの内側に配置されている<h:dataTable>
、<ui:repeat>
など、あなたがまったく同じことを確認する必要がありvalue
反復処理コンポーネントの中に保存されているフォームの要求値適用フェーズは、リクエストを送信してください。JSFはそれを繰り返して、クリックされたリンク/ボタンと送信された入力値を見つけます。Beanをビュースコープに配置するか@PostConstruct
、Beanにデータモデルをロードするようにして(したがってゲッターメソッドではなく!)、それを修正する必要があります。h:dataTableのデータベースからモデルをロードする方法とタイミングも参照してください。
場合UICommand
やUIInput
コンポーネントがのようなダイナミックなソースによって含まれている<ui:include src="#{bean.include}">
、あなたは正確に同じことを確認する必要があります#{bean.include}
フォームのビュービルド時にリクエストを送信した値が保存されます。JSFは、コンポーネントツリーの構築中に再実行します。Beanをビュースコープに配置するか@PostConstruct
、Beanにデータモデルをロードするようにして(したがってゲッターメソッドではなく!)、それを修正する必要があります。ナビゲーションメニューで動的インクルードコンテンツをajax-refreshする方法も参照してください。(JSF SPA)。
rendered
コンポーネントとその親のすべての属性とtest
任意の親の属性は、<c:if>
/ <c:when>
に評価されてはならないfalse
フォーム要求を提出の要求値の適用フェーズ中に。JSFは、改ざん/ハッキングされた要求に対する保護の一環として再チェックします。条件の原因となる変数を@ViewScoped
Beanに格納するか、Beanの条件を適切に事前初期化していることを確認する@PostConstruct
と、@RequestScoped
問題が修正されます。同じことがdisabled
コンポーネントの属性にもtrue
当てはまり、リクエスト値の適用フェーズでは評価されません。参照してくださいJSFのCommandButtonアクションが呼び出されない、フォームが処理されない条件付きでレンダリングされたコンポーネントに提出し、h:commandButtonは、<h:panelGroup Rendered>でラップすると機能しなくなります。
コンポーネントのonclick
属性とUICommand
コンポーネントのonsubmit
属性がJavaScriptエラーをUIForm
返しfalse
たり、引き起こしたりしてはなりません。ブラウザのJSコンソールにJSエラーが表示されるか、表示されないようにする<h:commandLink>
必要が<f:ajax>
あります。通常、正確なエラーメッセージをグーグルすることで、すでに回答が得られます。参照してください。キャッチされないTypeErrorsでPrimeFacesの結果と手動で追加/負荷のjQueryを。
JSF 2.x <f:ajax>
またはPrimeFaces <p:commandXxx>
などを介してAjaxを使用している場合は<h:head>
、マスターテンプレートにの代わりにがあることを確認してください<head>
。そうしないと、JSFはAjax関数を含む必要なJavaScriptファイルを自動インクルードできません。これにより、ブラウザのJSコンソールで「mojarra is not defined」や「PrimeFaces is not defined」などのJavaScriptエラーが発生します。f:ajaxおよびui:repeatと一緒に使用するとh:commandLink actionlistenerが呼び出されないも参照してください。
Ajaxを使用していて、送信された値がになる場合は、対象のおよびコンポーネントがまたはでカバーされてnull
いることを確認してください。そうでない場合、それらは実行/処理されません。<f:ajax>を<h:commandButton>に追加するときにモデルで更新されない送信済みフォームの値およびPrimeFacesプロセス/更新とJSF f:ajax実行/レンダリング属性についても参照してください。UIInput
UICommand
<f:ajax execute>
<p:commandXxx process>
送信された値が依然としてでありnull
、CDIを使用してBeanを管理している場合は、正しいパッケージからスコープアノテーションをインポートしてください。そうでない場合、CDIはデフォルト@Dependent
で、ELのすべての単一評価でBeanを効果的に再作成します式。@SessionScoped Beanもスコープを失い、常に再作成され、フィールドはnullになり、JSF 2アプリケーションのデフォルトの管理対象Beanスコープは何ですか?も参照してください。
親ならば<h:form>
とUICommand
、ボタンが事前にレンダリングされている/同一ページ内の別のフォームから来るのAjaxリクエストによって更新され、その後、最初のアクションは常にJSF 2.2またはそれ以上の年齢で失敗します。2番目以降のアクションは機能します。これは、JSF仕様の問題790として報告され、現在JSF 2.3で修正されているビューステート処理のバグが原因です。古いJSFのバージョンでは、明示的にIDを指定する必要が<h:form>
でrender
の<f:ajax>
。参照してください時間:commandButtonの/ hは:のcommandLinkは、最初のクリックで動作しない、唯一の第二のクリックで動作します。
場合<h:form>
しているenctype="multipart/form-data"
サポートファイルのアップロードするために設定され、その後、あなたは、そうでない場合は、少なくともJSF 2.2を使用して、またはマルチパート/フォームデータ要求を解析するための責任があるサーブレットフィルタが正しく設定されていることをしていることを確認する必要がありFacesServlet
意志をリクエストパラメータをまったく取得しないため、リクエスト値を適用できません。このようなフィルターの構成方法は、使用されているファイルアップロードコンポーネントによって異なります。トマホークの<t:inputFileUpload>
場合はこの回答を確認し、PrimeFacesの<p:fileUpload>
場合はこの回答を確認してください。または、実際にファイルをまったくアップロードしない場合は、属性を完全に削除します。
ほとんどのIDEが最初のオートコンプリートオプションとして提案しているように、のActionEvent
引数がactionListener
である ことを確認してください。を使用する場合も、引数がないことは間違いです。メソッドに引数が必要ない場合は、を使用してください。または、実際にの代わりに使用したい場合もあります。actionとactionListenerの違いも参照してください。javax.faces.event.ActionEvent
java.awt.event.ActionEvent
actionListener="#{bean.method}"
actionListener="#{bean.method()}"
action
actionListener
たとえばやを呼び出して、アクションの呼び出しフェーズをスキップするPhaseListener
ようEventListener
に、リクエスト/レスポンスチェーンの何も変更されていないことを確認してください。FacesContext#renderResponse()
FacesContext#responseComplete()
なんらかの理由で要求がブロックされていないFilter
かServlet
、同じ要求応答チェーン内にあることを確認してくださいFacesServlet
。たとえば、Spring Securityなどのログイン/セキュリティフィルター。特にajaxリクエストでは、デフォルトではUIフィードバックがまったくありません。Spring Security 4およびPrimeFaces 5のAJAXリクエスト処理も参照してください。
PrimeFaces <p:dialog>
またはを使用<p:overlayPanel>
している場合は、それらが独自のものを持っていることを確認してください<h:form>
。なぜなら、これらのコンポーネントはデフォルトでJavaScriptによってHTMLの最後に再配置されるから<body>
です。したがって、元々はの中に座っていた<form>
場合は、もはやに座っていません<form>
。p:commandbuttonアクションがp:dialog内で機能しないも参照してください
フレームワークのバグ。たとえば、RichFacesには、属性(または、場合によってはサブ要素)を持つUI要素を使用すると、「変換エラー」が発生します。このバグにより、カレンダーの日付に値が設定されていない場合にBeanメソッドが呼び出されなくなります。フレームワークのバグの追跡は、簡単な作業例から始めて、バグが見つかるまでページを作成し直すことで実現できます。rich:calendar
defaultLabel
rich:placeholder
それでも行き詰まっている場合は、デバッグの時間です。クライアント側で、WebブラウザーでF12キーを押して、Web開発者ツールセットを開きます。[ コンソール ]タブをクリックして、JavaScript コンソールを表示します。JavaScriptエラーがあってはなりません。以下のスクリーンショットは、宣言されて<f:ajax>
いない<h:head>
(上記のポイント7で説明されている)間に有効なボタンを送信するケースを示すChromeの例です。
[ ネットワーク ]タブをクリックして、HTTPトラフィックモニターを表示します。フォームを送信し、リクエストヘッダーとフォームデータ、および応答本文が期待どおりかどうかを調査します。スクリーンショットの下には成功したアヤックスは、単一でシンプルなフォームの提出を示してChromeからの例で<h:inputText>
、シングル<h:commandButton>
と<f:ajax execute="@form" render="@form">
。
(警告:上記のようなHTTPリクエストヘッダーのスクリーンショットを本番環境から投稿する場合は、スクリーンショットのセッションCookieをスクランブル/難読化して、セッションハイジャック攻撃を回避してください!)
サーバー側で、サーバーがデバッグモードで起動されていることを確認します。フォーム送信の処理中に呼び出されると予想される対象のJSFコンポーネントのメソッドにデバッグブレークポイントを配置します。たとえば、UICommand
コンポーネントの場合はそれがUICommand#queueEvent()
、UIInput
コンポーネントの場合はになりますUIInput#validate()
。コード実行をステップ実行し、フローと変数が期待どおりかどうかを調べます。以下のスクリーンショットは、Eclipseのデバッガーの例です。
あなたh:commandLink
が中にいる場合、h:dataTable
それが機能しh:commandLink
ない可能性がある別の理由があります:
にバインドされている基礎となるデータソースはh:dataTable
、リンクがクリックされたときにトリガーされる2番目のJSF-Lifecycleでも使用できる必要があります。
したがって、基になるデータソースがリクエストスコープの場合、h:commandLink
機能しません。
私の回答は100%当てはまるわけではありませんが、ほとんどの検索エンジンはこれを最初のヒットとして見つけましたが、それでも投稿することにしました。
PrimeFaces(または同様のAPI)を使用している場合p:commandButton
またはp:commandLink
、チャンスはあなたが明示的に追加することを忘れているということであるprocess="@this"
コマンド・コンポーネントに。
『PrimeFaces User's Guide』のセクション3.18に記載されているように、process
およびのupdate
両方@form
のデフォルトは、プレーンJSF f:ajax
またはRichFacesに期待されるデフォルトであるexecute="@this"
およびにrender="@none"
それぞれ反対しています。
調べるのに時間がかかった。(...そしてJSFとは異なるデフォルトを使用することはかなり賢くないと思います!)
process
は@form
です。したがって、アクションがこのように呼び出されないが、を使用するときに呼び出される場合、@this
おそらく私の答えのポイント3が適用されます。
p:commandButton
私が追加されるまでのactionListenerメソッド呼び出しませんでしたがprocess="@this"
。さらに、PrimeFacesユーザーガイドには、セクション3.18と3.19で述べたデフォルトが明示されています。それはここにあります:primefaces.googlecode.com/files/primefaces_users_guide_3_4.pdf ...多分デフォルトは変更されましたか?
process="@this"
して追加<p:messages autoUpdate="true">
(またはキューに入れられているが表示されていないメッセージのサーバーログを読み取るだけ)を行うと、実際に変換/検証エラーが発生していることがわかります。
Primefacesに関係するもう1つのことを述べp:commandButton
ます。
p:commandButton
サーバーで実行する必要のあるアクションにを使用すると、サーバーへのajax / non-ajaxリクエストを引き起こさずにカスタムJavaScriptを実行するために使用されるプッシュボタン用であるtype="button"
ため、使用できません。
この目的のために、type
属性をディスペンスする"submit"
か(デフォルト値は)、明示的にを使用できますtype="submit"
。
これが誰かを助けることを願っています!
p:commandButton
経験しましたが、調査したところ、いくつかのtype
属性値があり、button
クライアント側のすべてに関係するものでした。それはでこれを見つけることが少し難しいPrimefaces
のdocが、ここで一つのリンクは次のとおりです。developer.am/primefaces/...
私自身、この問題に悩まされ、この問題の原因をもう1つ見つけました。* .xhtmlで使用されるプロパティのバッキングBeanにセッターメソッドがない場合、アクションは呼び出されません。
PropertyNotWritableException
です。表示されない場合は、適切なajax例外ハンドラーなしでajaxリクエストを発行した可能性がありますが、サーバーログに表示されるはずです。
最近、IBM Extended Faces Componentsを使用するJSF 1.2アプリケーションでUICommandが呼び出されないという問題に遭遇しました。
データテーブルの行にコマンドボタンがありました(拡張バージョンなので、 <hx:datatable>
)、UICommandはテーブルの特定の行からは起動しませんでした(起動しない行は、デフォルトの行表示サイズより大きい行でした)。
表示する行数を選択するためのドロップダウンコンポーネントがありました。このフィールドを裏付ける値はにありましたRequestScope
。テーブル自体を支えるデータは、一種のViewScope
(実際には、一時的にSessionScope
)でした。
どの値もデータテーブルのrows
属性にバインドされているコントロールを介して行の表示が増加した場合、この変更の結果として表示された行がクリックされたときにUICommandを起動できませんでした。
この属性をテーブルデータ自体と同じスコープに配置すると、問題が解決しました。
これは上記のBalusC#4で暗示されていると思いますが、テーブル値をビューまたはセッションスコープにする必要があるだけでなく、そのテーブルに表示する行数を制御する属性も必要でした。
私もこの問題を抱えていて、ブラウザーのWebコンソールを開いてから、根本的な原因を突き止めるようになりました。それまでは、エラーメッセージを受け取ることができませんでした(を使用しても<p:messages>
)。Webコンソールに、から返されるHTTP 405ステータスコードが表示されました<h:commandButton type="submit" action="#{myBean.submit}">
。
私の場合、Auth0を介してOAuth認証を提供するバニラHttpServletと、アプリケーションビューとビジネスロジックを実行するJSFファセットとBeanが混在しています。
web.xmlをリファクタリングし、middle-man-servletを削除すると、「魔法のように」機能しました。
結論として、問題は、middle-man-servletがRequestDispatcher.forward(...)を使用してHttpServlet環境からJSF環境にリダイレクトするのに対して、サーブレットがHttpServletResponse.sendRedirect(..でリダイレクトされる前に呼び出されていたことです。 。)。
基本的に、sendRedirect()を使用すると、JSFの「コンテナー」が制御を取得できましたが、RequestDispatcher.forward()は明らかにそうではありませんでした。
私が知らないのは、faceletがBeanのプロパティにアクセスできたが設定できなかった理由です。これは、サーブレットとJSFの混合を排除することで明らかに悲鳴を上げていますが、これが誰かが何時間もヘッドを回避するのに役立つことを願っていますto-table-banging。
配置に関する問題を修正しました:
<h:commandButton class="btn btn-danger" value = "Remove" action="#{deleteEmployeeBean.delete}"></h:commandButton>
に:
<h:form>
<h:commandButton class="btn btn-danger" value = "Remove" action="#{deleteEmployeeBean.delete}"></h:commandButton>
</h:form>
これは私のために働いている解決策です。
<p:commandButton id="b1" value="Save" process="userGroupSetupForm"
actionListener="#{userGroupSetupController.saveData()}"
update="growl userGroupList userGroupSetupForm" />
ここでは、Ajax呼び出しにはprocess = "userGroupSetupForm"属性が必須です。actionListenerが@ViewScope Beanからメソッドを呼び出しています。グロウルメッセージ、Datatable:userGroupListおよびForm:userGroupSetupFormも更新します。
<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>
解決する;
<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>