1

私の Web アプリ、JSF2 (mojarra 2.1.20) では、次のスニペットを持つコンポーネントを持つページで奇妙な動作があります。

<h:commandLink ... action="#{cc.attrs.bean.next}">
    <f:ajax execute="@this" render=":#{cc.clientId}" />
</h:commandLink>

アクションnext()は常に呼び出されるわけではありません。この問題は、何らかの理由で URL パラメータ ID に関連していることがわかりました。

<f:metadata>
    <f:viewParam name="id" value="#{torneoBean.idParam}" required="true" />
</f:metadata>

上記のviewParamを挿入すると、問題が発生します。しかし、私はそれを取り除くことはできません。ajax リクエストをデバッグすると、開始、成功、完全なイベント シーケンスが呼び出されたように見えます (エラーなし)。レンダリングするコンポーネントは正しくレンダリングされますが、アクションは起動されません。この状況をデバッグして、問題の根本原因を突き止める方法はありますか?

4

1 に答える 1

3

どうやら、 ajax リクエストごとに a を添付していないか、更新していません<h:message(s)><f:viewParam id="torneo_id">そうしないと、必要な検証エラーが表示されます。具体的な問題は、基本的に、commandButton/commandLink/ajax アクション/リスナー メソッドが呼び出されないか、入力値が更新されないのポイント 3 でカバーされます。

原因については、<f:viewParam>すべての HTTP リクエストで、また ajax ポストバックでも実行されます。ajax リクエストが送信されると、目的のリクエスト パラメータが現在のリクエストに存在しないため<f:viewParam>、必要な検証に失敗します。

これにはいくつかの解決策があります。

  1. <f:param>コマンドコンポーネントで、後続のリクエストのリクエストパラメータを保持します。

    <h:commandLink ...>
        ...
        <f:param name="id" value="#{param.id}" />
    </h:commandLink>
    
  2. 非ポストバック時にのみ必須にします。これは、ページが最初に GET 要求によって開かれた場合にのみ機能します。ただし、リダイレクト以外のナビゲーションで開いた場合でも、失敗します。

    <f:viewParam ... required="#{not facesContext.postback}" />
    
  3. <f:viewParam>JSF ユーティリティ ライブラリOmniFacesによって提供されるものに置き換え<o:viewParam>ます。required="true"同じ属性を使い続けることができるように、ポストバックを暗黙的にオフにします。

    <o:viewParam ... required="true" />
    
于 2013-04-07T00:22:25.620 に答える