0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

カスタムアノテーションをグループ化する。

Posted at

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"
    }

( ・。。・ )🖐

間違っている内容がありましたら、教えて頂ければ喜びます。

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?