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)