1

JSF、PrimeFaces 3.2、Omnifaces 1.1、JBoss AS 7.1.1、Final、Mojarra2.1.7を使用しています

次のように、両方とも必須ではない2つの数値フィールドを持つフォームがあります。

<h:form>
    <p:inputText id="num1" value="#{bean.field1}"/>
    <p:inputText id="num2" value="#{bean.field2}"/>
<p:commandButton ... ajax="true" />
</h:form>

また、faces-configでOmniFacesResetInputAjaxActionListenerを設定しました。

Beanプロパティfield1およびfield2は整数です。

ここで問題となるのは、num1に123と入力し、num2に345と入力して、[OK]をクリックした場合です。次に、num1から123を削除し、num2にabcを配置するとします。次に、検証(変換)エラーが表示されますが、123が戻ってきます!

両方をrequired=trueにすると、すべて問題ありません。

オプションのフィールドでこれを機能させる方法はありますか?

4

1 に答える 1

1

これは Mojarra 固有の問題です。にバインドされているフィールドは、送信された空の文字列値を に変換し、それをコンポーネントのローカル値に設定するIntegerによって暗黙的に変換されます。IntegerConverternull

送信後にフォームが再表示されると、JSF はまず送信された値が null でないかどうかを確認してから表示し、ローカル値が null でない場合はそれを表示し、それ以外の場合はモデル値を表示します。ローカル値が null であるため、代わりにモデル値が表示されています。これは実際には望ましくない動作であり、何度か報告されています。

UIInput#getValue()これは、次のようにオーバーライドすることで修正できます。

public Object getValue() {
    return isLocalValueSet() ? getLocalValue() : super.getValue();
}

MyFacesはすでにそれを正しく行っています。この問題を再度報告しましたが、最終的には仕様の問題 566 (更新され、最終的に Mojarra 2.2.0 で修正され、2.1.21にバックポートされました) になりました。

それまでの間、これを回避する最も簡単な方法は、PrimeFaces などの独自のレンダラーを備えたサードパーティ コンポーネント ライブラリを考慮しながら、javax.faces.component.UIInputクラスのソース コード ファイルをプロジェクトのソース フォルダーに直接コピーしてから、目的のUIInput#getValue()メソッドを追加することです。はい、不器用な修正ですが、問題の原因は JSF API 自体の奥深くにあるため、実際にはより良い方法はありません。

OmniFacesResetInputAjaxActionListenerはまったく異なる目的を果たし、この問題を解決するようには設計されておらず、適していません。コンポーネントの値が送信されていない入力コンポーネントの状態をクリアすることになっていますが、コンポーネント自体は ajax で再レンダリングされます。

于 2012-10-11T13:16:24.000 に答える