decadence

個人のメモ帳

BeanValidationのmessage変数を更に翻訳したい

BeanValidationでConstraintValidatorとか使ってて、独自Validatorでmessageに埋め込む変数も良い感じに翻訳したいなと思った次第

元々@Sizeにはmessageとして、以下のようなものが割り当ててられており、{min}などには渡したパラメータが埋められる。

javax.validation.constraints.Size.message=size must be between {min} and {max}

もちろん独自のValidatorを作った際にも利用出来て、ELとかも書ける。

初めはSpringのMessageSourceの一部メソッドをoverrideしようと思ったけど、beanvalidationの変数埋め込みの方がMessageSourceより後に走るので上手く出来なかった。 Vaidatorを眺めてると、以下のドキュメントにもあるようにMessageInterpolatorで良い感じにhookする所があった。ので、ただそこに翻訳処理を仕込むだけ。

Bean Validation specification

利用側

@Constraint(validatedBy = MySizeLongValidator.class )
public @interface MySizeLong {
    String message() default "{my.validation.size.long}";
    int max() default Integer.MAX_VALUE;
    String field() default "field";
}
public class Form {
    @MySizeLong(max = 10, field = "{form.str.name}")
    private String str;
}
my.validation.size.long={field} is too long
form.str.name=str_en_name

以下のように変換される

  1. {my.validation.size.long}: MySizeLong.message
  2. {field} is too long: MessageSource.getMessage
  3. {form.str.name} is too long: ResourceBundleMessageInterpolator.interpolate
  4. str_en_name is too long: ReTransableMessageInterpolator.interpolate

EL? 知らない子ですね