コンピュータクワガタ

かっぱのかっぱによるコンピュータ関連のサイトです

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が使えるだけでかなり幅が広がったように思えます。