【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文字の範囲内である必要があります。いかがでしたでしょうか?簡単ですね!
是非活用してみてください!
ではっ
 
	 
			是非フォローしてください
最新の情報をお伝えします
