JSR 349: Bean Validation 1.1でEL 3.0を使ってメッセージをカスタマイズしよう
JSR 349: Bean Validation 1.1ではメッセージをEL 3.0を使ってカスタマイズできるようになりました。
今回は、文字列の長さチェックのValidatorをサンプルにEL 3.0を使うとこんなことができますよというのを紹介します。
まず、Bean ValidationをMavenで準備します。Bean Validation本体の他に、参照実装のhibernateのValidator、EL 3.0の実装も別途必要になります。
<dependency> <groupId>org.glassfish</groupId> <artifactId>javax.el</artifactId> <version>3.0.0</version> </dependency> <dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> <version>1.1.0.Final</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>5.1.1.Final</version> </dependency>
サンプルは、 http://yamkazu.hatenablog.com/entry/20110206/1296985545 を参考にしました。
package net.kuwalab.jsr349; import java.util.Set; import javax.validation.ConstraintViolation; import javax.validation.Validation; import javax.validation.Validator; import javax.validation.ValidatorFactory; import javax.validation.constraints.NotNull; import org.hibernate.validator.constraints.Length; public class Book { @NotNull @Length(min = 10, max = 10) private String isbn; @NotNull @Length(min = 3, max = 30) private String name; @NotNull private Integer price; // getter、setterは省略 public static void main(String... args) { ValidatorFactory validatorFactory = Validation .buildDefaultValidatorFactory(); Validator validator = validatorFactory.getValidator(); Book book = new Book(); book.setIsbn("123456789ab"); book.setName("1"); Set<ConstraintViolation<Book>> violations = validator.validate(book); for (ConstraintViolation<Book> violation : violations) { System.out.println(violation.getPropertyPath()); System.out.println(violation.getMessage()); } } }
最後に、EL 3.0を使えるメッセージです。省略してELを使った部分だけに絞り込んでいます。
org.hibernate.validator.constraints.Length.message=${min == max ? min += '文字で入力してください' : min += '〜' += max += '文字で入力してください'}
ELによって分岐ができ、文字列の結合もできるため、minとmaxが違う場合には「min〜max文字で入力してください」というメッセージ、同じ場合には「min文字で入力してください」というメッセージにすることができます。
ELをメッセージに適用することによって、カスタムValidatorを作らずにある程度はメッセージファイルで何とかできることが増えたように思えます。
仕様もまだ読みきっていないのでどの程度何ができるか、全体を把握はしていませんが、ELが使えるだけでかなり幅が広がったように思えます。