SpringBootで日付形式のバリデーション処理

SpringBootで日付形式のバリデーション処理

SpringBootで日付形式のバリデーション処理を行うには、javax.validationパッケージを使用するのが一般的です。
javax.validationは、Bean Validation APIの標準仕様であり、日付形式のバリデーションには@Patternアノテーションやカスタムバリデーターを使用する方法があります。

基本的なバリデーション処理

@Patternアノテーションを使用する方法

@Patternアノテーションを使用して、文字列が特定の正規表現パターンに一致するかどうかを検証できます。
日付形式のバリデーションには、正規表現を使って日付形式を指定します。

import javax.validation.constraints.Pattern;

public class DateForm {

  // フォーマットに合わない場合、messageのエラーメッセージが取得される
  @Pattern(regexp = "^\\d{4}-\\d{2}-\\d{2}$", message = "日付のフォーマットが正しくありません。")
  private String date;

  // getters and setters
}

上記の例では、yyyy-MM-dd形式の日付を検証しています。

カスタムバリデーターを使用する方法

複雑なバリデーションロジックが必要な場合、カスタムバリデーターを作成するのが適しています。

カスタムアノテーションの作成
アノテーション名がValidDateになる。

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

@Target({ ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE, ElementType.LOCAL_VARIABLE })
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = DateValidator.class)
public @interface ValidDate {
  String message() default "Invalid date format";
  Class<?>[] groups() default {};
  Class<? extends Payload>[] payload() default {};
}

カスタムバリデーターの実装
ConstraintValidatorインターフェースのメソッドを実装

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

public class DateValidator implements ConstraintValidator<ValidDate, String> {

  private static final String DATE_FORMAT = "yyyy-MM-dd";

  @Override
  public void initialize(ValidDate constraintAnnotation) {
  }

  @Override
  public boolean isValid(String date, ConstraintValidatorContext context) {
    if (date == null || date.isEmpty()) {
      return true; // Assuming null or empty values are valid
    }
    SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT);
    sdf.setLenient(false);
    try {
      sdf.parse(date);
      return true;
    } catch (ParseException e) {
      return false;
    }
  }
}

フォームクラスでカスタムアノテーションを使用

public class DateForm {

  @ValidDate
  private String date;

  // getters and setters
}

カスタムバリデーションについては、以下でも詳しく記載しています。
ti-tomo-knowledge.hatenablog.com

コントローラーでのバリデーション処理

バリデーションを適用するには、コントローラーで@Validアノテーションを使用します。

import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.validation.Valid;

@Controller
@RequestMapping("/date")
public class DateController {

  @PostMapping("/validate")
  public String validateDate(@Valid @RequestBody DateForm dateForm, BindingResult result) {
    if (result.hasErrors()) {
      return "error";
    }
    return "success";
  }
}

まとめ

SpringBootで日付形式のバリデーションを実装するには、@Patternアノテーションを使った簡単な方法と、カスタムバリデーターを用いた詳細なバリデーションの2つの方法があります。
@Patternは簡単なケースに適しており、カスタムバリデーターはより複雑な検証が必要な場合に有効です。