DTOやFORMのフィールドに付けたカスタムアノテーションを、グループ化して、適応する。
方法
前提:自分が作ったカスタムvalidatorアノテーションがある。
例えば、Requiredアノテーション
package com.example.validation;
import jakarta.validation.Constraint;
import jakarta.validation.Payload;
import java.lang.annotation.*;
@Constraint(validatedBy = RequiredValidator.class)
@Target({ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Required {
// エラーメッセージ
String message() default "This field is required";
// グループ(標準の仕様で必要!これがないとグループ化出来ない)
Class<?>[] groups() default {};
// ペイロード
Class<? extends Payload>[] payload() default {};
}
RequiredValidator.classも必要でしょ
package com.example.validation;
import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;
public class RequiredValidator implements ConstraintValidator<Required, Object> {
@Override
public boolean isValid(Object value, ConstraintValidatorContext context) {
if (value == null) {
return false;
}
if (value instanceof String) {
return !((String) value).trim().isEmpty();
}
return true;
}
}
上のカスタムアノテーションをDTOクラスとかのフィールドに使用。
@Required(message = "Aは必須です。")
private String myA;
@Required(message = "Bは必須です。")
private String myB;
SpringのValidatedアノテーションを使用して、リクエストを検証。
@GetMapping
public String create(@Validated CustomDto myDto, BindingResult bindingResult) {
if(BindingResult.hasErrors()){
// バリデーションが失敗した場合
}
return "遷移先URL"
}
しかし、同じエンティティまたはDTOを使って、複数のメソッド(例: 作成、更新、削除)に応じた異なるバリデーションを実行する必要がある場合がある。
例えば、以下の二つの機能があると、各機能に適したバリデーションを適用するためにグループ化が必要だ。
1.新規作成(Create):Aは不要、Bは必須。
2.更新(Update):Aは必須、Bも必須。
適当な場所に以下のように空っぽのinterfaceを作る。
public interface CreateGroup {}
public interface UpdateGroup {}
DTOでグループを使用
@Required(message = "Aは必須です。", groups = CreateGroup.class)
private String myA;
@Required(message = "Bは必須です。", groups = {CreateGroup.class, UpdateGroup.class}
private String myB;
コントローラで適用
@GetMapping
public String create(@Validated(CreateGroup.class) CustomDto myDto, BindingResult bindingResult) {
if(BindingResult.hasErrors()){
// バリデーションが失敗した場合
}
return "遷移先URL"
}
@GetMapping
public String update(@Validated(UpdateGroup.class) CustomDto myDto, BindingResult bindingResult) {
if(BindingResult.hasErrors()){
// バリデーションが失敗した場合
}
return "遷移先URL"
}
( ・。。・ )🖐
間違っている内容がありましたら、教えて頂ければ喜びます。