Java:アノテーションでバリデーションする
#Java_EE
#Spring
概要
FormなどのBeanをアノテーションでバリデーションする
めちゃくちゃ沼にハマった記憶があるなぁ
参照
参考Github
バリデーションアノテーション一覧
/icons/重要.icon アノテーションでのバリデーションが参考になる
相関チェック
相関チェックの実装
自前ConstraintValidatorでのエラーメッセージの表示方法 ConstraintValidator
GroupsSeuquenseでバリデーションの順序指定はアンチパターン?
まとめ
Validationの実行
①データ型を定義し、バリデーション用のアノテーションを付与
②Validatorを用意する
Validation.buildDefaultValidatorFactory().getValidator()
③バリデーションを実行
validator.validate(data)
④エラーを確認
エラーがある場合ConstraintViolation<A>が生成される
エラーメッセージの定義
①アノテーションに指定  @NotNull(message = "エラーメッセージ")
②ValidationMessages.propertiesにリソースとして定義
@NotNull(message = "{myerrormessage}")
自分で定義したアノテーションにインナーインタフェースListが存在する理由
同じアノテーションで複数の条件を指定したい場合のため
@Patternのサンプル
code:Java
@Pattern.List({
@Pattern(regexp = "^aaa.*"),
@Pattern(regexp = ".*bbb$")
})
Bean Validationのアノテーションに付いてるListについて
@Validと@Validatedの違い
import javax.validation.Valid  使用時@Valid
org.springframework.validation.annotation.Validated
挙動は同じ
違いとしては、処理をデリゲート(委譲)するのがjavax~なのかspring~なのか
アノテーションの適用順番
code:java
@NotBlank
@NotEmpty
private String hoge;
// この場合プロパティに近い順番(NotEmpty → NotBlank)で適用される
アノテーションでのバリデーション順序
基本的には
1.必須バリデーション
2.フォーマットバリデーション
3.相関バリデーション
相関チェック
複数のプロパティからbooleanを計算して、@AssertTrueでバリデーションする
code:java
@AssertTrue
public boolean isZipcodeValid() {
if ((zipcode1.isBlank() && zipcode2.isBlank())
|| ((zipcode1.length() == 3) && (zipcode2.length() == 4))) {
return true;
}
return false;
}
クラスに付ける