2

以下のサンプルを検討してください。これは、fromDatetoDateが有効な日付であるかどうか、およびfromDateが より小さいかどうかを確認しtoDateます。

@CustomValidator(type = "DateValidator", 
            fieldName = "fromDate",
         shortCircuit = true),

@CustomValidator(type = "DateValidator", 
            fieldName = "toDate",
         shortCircuit = true),

@CustomValidator(type = "CompareDatesValidator", 
              message = "validate.date.jalali.same.or.before",
         shortCircuit = true, 
           parameters = {
        @ValidationParameter(name = "fromDateParam", value = "${fromDate}"),
        @ValidationParameter(name = "toDateParam", value = "${toDate}") 
               })

はをDateValidator拡張しFieldValidatorSupport、 は をCompareDatesValidator拡張しますValidatorSupport

私はshortCircuitsDateValidatorを持っていますが、 CompareDatesValidator常に実行されていますが、これは正しくありません。これを修正できますか?!

4

1 に答える 1

2

ドキュメントで説明されているとおりです。

プレーン バリデーターは、フィールド バリデーターよりも優先されます。最初に定義された順序で検証され、次にフィールドバリデータが定義された順序で検証されます。短絡としてマークされた特定のバリデーターが失敗すると、後続のバリデーターの評価が妨げられ、エラー (バリデーターのタイプに応じてアクション エラーまたはフィールド エラー) が検証されるオブジェクトの ValidationContext に追加されます。

次に、実際の実行順序は次のとおりです。

  1. CompareDatesValidator (プレーン)
  2. DateValidator (フィールドfromDate)
  3. DateValidator (フィールドtoDate)

問題は、最初に実行されることですが、そのチェックは 2 つのフィールドに基づく複合チェックであるため、フィールド自体のアトミック チェックを最初に実行する必要があります。

しかし、これがフレームワークの仕組みなので回避策が必要です

単純なバリデーターがまだこれである場合(多少の変更があっても)、チェックを回避し、入力が有効でない場合にエラーを無視して、フィールドバリデーターの所属する場所でこの検証を行うことができます。

public final class CompareDatesValidator extends ValidatorSupport {
    private String fromDate; // getter and setter
    private String toDate;   // getter and setter    

    @Override
    public void validate(Object o) throws ValidationException {
        Date d1 = (Date)parse(fromDate, Date.class);
        Date d2 = (Date)parse(toDate, Date.class);

        if (d1==null || d2==null){
            LOG.debug("Silently disabling Plain Validator. Check performed by Field ones");
        } else if (d2.before(d1)){
            addActionError(getDefaultMessage());
        }
    }
}

フィールドバリデーターを常にCompareDatesValidatorの同じ検証スタックに配置することを覚えておく必要があるだけです。そうしないと、「日付が無効です」というエラーが黙って飲み込まれます。

于 2015-12-23T17:18:21.470 に答える