#概要
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を返すように実装。
#参考文献
・https://terasolunaorg.github.io/guideline/public_review/ArchitectureInDetail/Validation.html#validation-correlation-check
・https://itneko.com/kotlin-validate-correlation/