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する所があった。ので、ただそこに翻訳処理を仕込むだけ。
利用側
@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
以下のように変換される
{my.validation.size.long}
: MySizeLong.message{field} is too long
: MessageSource.getMessage{form.str.name} is too long
: ResourceBundleMessageInterpolator.interpolatestr_en_name is too long
: ReTransableMessageInterpolator.interpolate
EL? 知らない子ですね