6

MyFacesとMojarra2.1の両方で、にjavax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL設定されてtrueいる場合、空白にされて送信されたときに、モデルに必須としてマークされ、事前に入力されているフィールドが、元の空白になっていない状態で再表示されるという欠陥があります。空白のままにする代わりに値。

シナリオは次のとおりです。

  1. ユーザーは、モデルからの既存のデータが入力された単一の必須フィールドを含むページをロードします
  2. ユーザーがページのフィールドをクリアしてフォームを送信します
  3. 期待どおりに検証が失敗し、ユーザーには必須フィールドに入力する必要があるというエラーメッセージが表示されます。

問題は、ユーザーが送信した内容(つまり、フィールドに空白の値を送信したこと)を表示するフィールドに、代わりにモデルの元の値が入力されることです。唯一の回避策は、に設定javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULLすることfalseです。falseページが必要なフィールドエラーメッセージで再表示されたときにフィールドが空白のままになるという望ましい動作を提供するように設定します。

Mojarra(http://java.net/jira/browse/JAVASERVERFACES-2375)とMyFaces(https://issues.apache.org/jira/browse/MYFACES-3525)で欠陥がログに記録されましたが、進捗はありません。 6週間で。

Mojarraでも6か月以上前に同様の問題が報告されたようですが、進展はありません。

javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULLfalseではなくtrueに設定し続けることができ、それでもこの必須のフィールドユーザビリティの問題に遭遇しないという回避策を知っている人はいますか?

4

1 に答える 1

8

この問題はJSF 2 - Bean Validation で詳しく説明されています: 検証に失敗しました -> 空の値はマネージド Bean からの最後の有効な値に置き換えられます。要するに、Mojarra ではバグまたは少なくとも見落としが原因であり、 issue 2266HtmlBasicRenderer#getCurrentValue()として報告されています。

当面の間、これを回避する最も簡単な方法は、PrimeFaces などの独自のレンダラーを備えたサードパーティのコンポーネント ライブラリを考慮しながらUIInput、プロジェクトのソース フォルダーにソース ファイルを直接コピーし、それにgetSubmittedValue()応じて編集することです。

public Object getSubmittedValue() {
    if (submittedValue == null && !isValid() && considerEmptyStringNull(FacesContext.getCurrentInstance())) {
        return "";
    }
    else {
        return submittedValue;
    }
}

最終的に/WEB-INF/classesは、JSF JAR ファイルのクラスローディングよりも優先されます。確かに、これは多少不器用ですが、JSF JAR ファイルを再構築したり、すべての入力レンダラーをオーバーライドしたりするよりも簡単です。

于 2012-05-21T21:29:29.907 に答える