0

@Year特定の年にa が発生するかどうかをチェックするというカスタム制約を作成しましDateた。

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD, ElementType.ANNOTATION_TYPE })
@Constraint(validatedBy = YearCheck.class)
public @interface Year {

  String message() default "{year.message}";

  Class<?>[] groups() default {};

  Class<? extends Payload>[] payload() default {};

  /**
   * The lower year. If not specified then no upper boundary check is performed.<br>
   * Special values are:
   * <ul>
   * <li>{@link TimeUtil#NOW} for the current year
   * </ul>
   */
  String min() default "";

  /**
   * The upper year. If not specified then no upper boundary check is performed.<br>
   * Special values are:
   * <ul>
   * <li>{@link TimeUtil#NOW} for the current year
   * </ul>
   */
  String max() default "";
}

には次のValidationMessages.propertiesものが含まれます。

year.message = must be a year between {min} and {max}

ご覧のとおり、minmaxは文字列です。これは、TimeUtil.NOW(定数を含む"now") が現在の年が比較に使用されることを意味するためです。

また、minormaxが指定されていない場合は、対応する値が無限大であることを意味します

したがって、たとえば、問題は次のとおりです。が設定されているminかどうかを確認するにはどうすればよいですか。数値でない場合 ( または のいずれか)、メッセージに挿入される値を設定するにはどうすればよいですか?min"""now"

たとえば@Year(min=1900,max=TimeUtil.NOW)、メッセージを生成する必要があります

must be a year between 1900 and 2013

stackoverflow に関するいくつかの回答を読み、ドキュメントを読みましたが、a) それが可能であり、b) 制約の実装またはカスタムでこれを行う必要があるかどうかはわかりませんMessageInterpolator

4

1 に答える 1

1

min が設定されているかどうか、数値でないかどうかを確認するにはどうすればよいですか

initialize()実装のメソッドで注釈属性にアクセスできますConstraintValidator

メッセージに挿入される値を設定するにはどうすればよいですか?

これを直接行うことはできませんがisValid()、渡された を使用して、バリデーターのメソッドでメッセージを自分で作成できますConstraintValidatorContext

全体として、バリデーターは次のようになります。

public class YearValidator implements ConstraintValidator<Year, String> {

    private Date min;
    private Date max;

    @Override
    public void initialize(Year constraintAnnotation) {
        if(constraintAnnotation.min().equals("")) {
            min = getMinimumDate();
        }
        else if(constraintAnnotation.min().equals(TimeUtil.NOW)) {
            min = getCurrentYear();
        }
        else {
            min = getYearFromString(constraintAnnotation.min());
        }

        //same for max()
}

    @Override
    public boolean isValid(Date value, ConstraintValidatorContext context) {
        if(value == null) {
            return true;
        }

        if(value.before(min) || value.after(max)) {

            context.disableDefaultConstraintViolation();

            //load/create the error message and set min and max in it
            String template = getTemplate(min, max);

            context
                .buildConstraintViolationWithTemplate(template)
                .addConstraintViolation();

            return false;
        }

        return true;
    }
}
于 2013-01-15T17:28:47.323 に答える