本格的な開発に向けてデータバインドの戦略が決まったので、バリデーションの仕組みも考えておかなくては。
元々バリデーションの仕組みはJava/Swing用、.NET C#/Windows Forms用と共用してきた使い慣れたものがあるので、それを再利用する予定だが、最初に設計した際にはアノテーションなどは無かったので、バリデーションの制約はは全てXMLで書いていた。
一から書き直すとかなり時間がかかりそうなので、XMLと実装はそのままに、JSR 303のアノテーションだけを取り込もうと思う。
- JSR 303アノテーションの例
public class Address {
@NotNull @Size(max=40)
private String name;
@Size(max=100)
private String address;
@Telno
private String tel;
}JSR 303は前から気になっていたが、良いなと思うのは、上記のような直感的な制約をフィールドに設定することの他に、以下のようにネストにしたメタデータによりカスタムな制約を作成できることである。
- Telno.java
@NotNull
@Size(max=12)
@Pattern(regexp="^[0-9]+$")
@Documented
@Target({ANNOTATION_TYPE, METHOD, FIELD})
@Retention(RUNTIME)
public @interface Telno {
String message() default "invalid telno";
}従来はXMLで共通の制約を記述して、それを参照することですることで同様の機能を実現していたが、
- constratint.xml (参考)
〜
決してベストだとは思わないが、コードの近傍に書けること、(一度、他のアノテーションを使ったことがあれば)より直感的であること、記述のしやすさと判りやすさは、アノテーションのほうが上だろう。
参考 : Java EE 6 Bean Validation Provides Entity Validation Metadata Model and API - InfoQ