Playframework + Javaで「yyyy-MM-ddかつ存在する場合」というの日付のバリデーション用アノテーションを作成する

今までアノテーション自体作ったことがなかったのでかなり苦労したのでここにまとめる。

概要

今回実装するのは下記のような要件を満たすバリデーション用のアノテーションである。

上記の2点である。

実装手順

  1. バリデーション用アノテーションを定義
  2. Validatorクラスを定義する
  3. formにそのアノテーションを付加する

1. バリデーション用アノテーションを定義 DateValidationAnnotation.java

// 任意の場所
package actions;

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
import static java.lang.annotation.ElementType.CONSTRUCTOR;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.PARAMETER;
import static java.lang.annotation.ElementType.TYPE_USE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

@Constraint(validatedBy = DateValidator.class)
@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE})
@Retention(RUNTIME)
public @interface DateValidationAnnotation {
  String message() default "任意のエラーメッセージ";

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

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

  String value() default "任意の値";
}

2. Validatorクラスを定義する DateValidator.java

package actions;

import play.data.validation.Constraints;
import play.libs.F;

import javax.validation.ConstraintValidator;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;

import static play.libs.F.Tuple;

public class DateValidator extends Constraints.Validator<String>
    implements ConstraintValidator<DateValidationAnnotation, String> {

  /** フォーマットの判定 */
  @Override
  public boolean isValid(String dateStr) {
    DateFormat format = new SimpleDateFormat("yyyy-MM-dd");
    try {
      format.setLenient(false);
      format.parse(dateStr);
    } catch (ParseException e) {
      return false;
    }
    return true;
  }

  @Override
  public F.Tuple<String, Object[]> getErrorMessageKey() {
    return Tuple("", new Object[] {});
  }
}

3. formにそのアノテーションを付加する

@DateValidatorAnnotation
public String date;

終了