LoginSignup
4
8

More than 3 years have passed since last update.

SpringBootで日付の相関チェックをする

Last updated at Posted at 2021-01-20

概要

SpringBootで複数項目を比較してバリデーションを行う方法(相関チェック)をまとめる。

コード

まず、ユーザから日付の入力を受け取るエンティティクラス。

package com.sample.Form;

import com.sample.Annotation.DayCheck;
import lombok.Data;

import javax.validation.constraints.NotNull;
import java.time.LocalDate;

@Data
@DayCheck //(1)
public class SearchLogForm {
  @NotNull(message = "日付入れてね^^") //(2)
  private LocalDate startDate;

  @NotNull(message = "日付入れてね^^")
  private LocalDate endDate;
}

解説
(1)->このあと作成する自作のアノテーションをクラス全体に付与。
(2)->そもそも日付が入力されていなければ意味がないのでNullを許さないように@NotNullアノテーションを付与。

次に、エンティティに付与するアノテーションクラス。

package com.sample.Annotation;

import com.sample.Validation.DayCheckValidation;

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;

@Documented
@Constraint(validatedBy = DayCheckValidation.class) //(1)
@Target(ElementType.TYPE) //(2)
@Retention(RetentionPolicy.RUNTIME)
public @interface DayCheck {
  String message() default "終了日は開始日よりあとを入力してね^^";

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

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

解説
(1)->このあと作成するバリデーションチェッククラスを指定。
(2)->複数項目をバリデートする場合クラスそのものに付与するのでTYPEを指定。

最後に、バリデーションチェッククラスを作成。

package com.sample.Validation;

import com.sample.Annotation.DayCheck;
import com.sample.Form.SearchLogForm;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

public class DayCheckValidation implements ConstraintValidator<DayCheck, SearchLogForm> { //(1)

  @Override
  public boolean isValid(SearchLogForm value, ConstraintValidatorContext context) {
    if (value.getStartDate() == null || value.getEndDate() == null) { //(2)
      return false;
    }
    return value.getStartDate().isBefore(value.getEndDate()) ? true : false; //(3)
  }
}

解説
(1)->ConstraintValidatorの<>の中には、カンマ前には上で作成したアノテーションを、後にはアノテーションを付与する(チェックを行う)エンティティクラスを指定。
(2)->日付がnullだとぬるぽが発生するのでnullチェック。
(3)->日付を比較。終了日が開始日より前だった場合falseを、あとだった場合trueを返すように実装。

実行結果

1611130067549.jpg
開始日を終了日より前の日付にすると...

1611130001999.jpg
ちゃんとチェックできてました。

参考文献

https://terasolunaorg.github.io/guideline/public_review/ArchitectureInDetail/Validation.html#validation-correlation-check
https://itneko.com/kotlin-validate-correlation/

4
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
8