マイナー・マイナー

隠れた名作の発掘が生きがい。

【Java】アノテーションを利用してフィールドの項目長をチェックする


スポンサードリンク

JavaでBeanやDTOのフィールドの項目長をチェックするサンプルプログラムを書きました。フィールドに項目長用のアノテーションを追加し、そのアノテーションとフィールドの項目長とを比較して、項目長がオーバーしていたらログ出力するコードです。

ソースコード

StringItem.java

項目長用の独自のアノテーションを作成します。

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

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface StringItem {
    int length();
}

SampleBean.java

項目長を設定したフィールドにStringItemのアノテーションを付加します。

public class SampleBean {
    @StringItem(length = 7)
    private String id;
    
    @StringItem(length = 3)
    private String firstName;
    
    @StringItem(length = 3)
    private String lastName;
    
    
    private int age;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

App.java

Beanからアノテーションとフィールド値を取得し、アノテーションのlengthとフィールド値のlengthを比較し、前者よりも後者が大きければログ出力します。

import java.lang.reflect.Field;
import java.util.Objects;

public class App {
    public static void main(String[] args) {
        SampleBean sampleBean = new SampleBean();
        sampleBean.setId("1234567");
        sampleBean.setFirstName("hoge");
        sampleBean.setLastName("foo");
        sampleBean.setAge(31);

        System.out.println("---values---");
        System.out.println(sampleBean.getId());
        System.out.println(sampleBean.getFirstName());
        System.out.println(sampleBean.getLastName());
        System.out.println(sampleBean.getAge());

        System.out.println("---check---");
        try {
            for (Field field : sampleBean.getClass().getDeclaredFields()) {
                // String型以外はスキップ
                if (field.getType() != String.class) {
                    continue;
                }

                // アノテーションと項目値を取得し、項目長が指定した長さを超えていないかをチェック
                field.setAccessible(true);
                if (Objects.nonNull(field.getAnnotation(StringItem.class))) {
                    // アノテーションを取得
                    StringItem stringItem = field.getAnnotation(StringItem.class);

                    // フィールド値を取得
                    String value = (String) field.get(sampleBean);

                    // 項目長チェック
                    if (Objects.nonNull(value) && stringItem.length() < value.length()) {
                        System.out.println("Field length is over. (" + field.getName() + " = " + value + ")");
                    }
                }
            }
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }
}

実行結果

App.javaを実行すると次のようになりました。firstNameの項目長が3に対し、コード中で4文字の文字を設定しているため、チェックで引っかかりました。

---values---
1234567
hoge
foo
31
---check---
Field length is over. (firstName = hoge)