【Java】バリデーション用の独自のアノテーションを実装したい!!実装例紹介

開発していると

独自でバリデーション用のアノテーションを実装したい!!という場面に遭遇することが多少なりともあるtだろう

「論より行動!!」という事で実装の例を紹介したと思います

今回紹介する実装例では、@StringLengthアノテーションを作成し、文字列の長さが指定された範囲内にあるかを検証します

では見ていきましょう!

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

// バリデーション用アノテーションクラスの定義
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface StringLength {
    int min() default 0; // 最小の文字列長
    int max() default Integer.MAX_VALUE; // 最大の文字列長
    String message() default "文字列の長さが無効です"; // バリデーションエラー時のメッセージ
}

// アノテーションを使用するクラス
public class User {
    @StringLength(min = 5, max = 10, message = "ユーザー名は5文字から10文字の範囲内である必要があります。")
    private String username;

    // コンストラクタやメソッドなど、他の部分も含まれる可能性があります

    // getterとsetterは省略
}

この例では、StringLengthアノテーションが、minおよびmaxという二つのメンバーを持っています
⇒ これらのメンバーは文字列の最小および最大の長さを指定するために使用されます

また、messageメンバーはバリデーションエラー時に表示されるメッセージを指定します

ちなみにですが、UserクラスのusernameフィールドにStringLengthアノテーションが適用されていますよ

上記ではまだ、バリデーションを実行するソースは含まれていません

以下はバリデーションを行うソースです

import java.lang.reflect.Field;

public class ValidationExample {
    public static void main(String[] args) {
        User user = new User();
        user.setUsername("TooLongUsername"); // 15文字

        // バリデーションを実行
        try {
            validateUser(user);
            System.out.println("バリデーション成功");
        } catch (ValidationException e) {
            System.out.println("バリデーションエラー: " + e.getMessage());
        }
    }

    static void validateUser(User user) throws ValidationException {
        // ユーザークラスのフィールドを取得
        Field[] fields = User.class.getDeclaredFields();

        // 各フィールドのバリデーションを実行
        for (Field field : fields) {
            if (field.isAnnotationPresent(StringLength.class)) {
                StringLength annotation = field.getAnnotation(StringLength.class);
                int minLength = annotation.min();
                int maxLength = annotation.max();
                String fieldValue;

                try {
                    // フィールドの値を取得
                    field.setAccessible(true);
                    fieldValue = (String) field.get(user);
                } catch (IllegalAccessException e) {
                    throw new ValidationException("バリデーションエラー: フィールドへのアクセスができません");
                }

                // 文字列の長さが範囲外の場合、例外をスロー
                if (fieldValue.length() < minLength || fieldValue.length() > maxLength) {
                    throw new ValidationException(annotation.message());
                }
            }
        }
    }
}

class ValidationException extends Exception {
    public ValidationException(String message) {
        super(message);
    }
}

ValidationExampleクラスでUserオブジェクトを生成し、validateUserメソッドを呼び出してバリデーションを行っています

usernameフィールドに15文字が含まれているため、バリデーションエラーが発生し、指定されたエラーメッセージが表示されるでしょう

⇓ 出力

// 以下出力
// バリデーションエラー: ユーザー名は5文字から10文字の範囲内である必要があります。

いかがでしたでしょうか?簡単ですね!
是非活用してみてください!

ではっ


是非フォローしてください

最新の情報をお伝えします