タツノオトシゴのブログ

主にJavaに関するものです。

SpELを使用したMessageInterpolator

BeanValidation1.1(JSR-349)から、メッセージ中にEL式が利用できるようになしました。
これを見てたら、普通のメッセージ中にもEL式が利用したくなりました。

Springは「MessageSource」がありますが引数は配列で、メッセージ中の項目はインデックス形式です。
名前形式でフォーマットしたい場合は、Commons-Langの「StrSubstitutor」などがあります。

思えば、Springには、SpELというEL式がSpring3から追加されいるため、これは使えるんじゃないかと思い、自作してみました。


Gistに追加しました。
特殊文字の二重定義の場合がうまくいきませんが。

https://gist.github.com/tatsu-no-otoshigo/0adf89df73c36d47fc19

/*
 * MessageInterporlator の仕様
 * ・名前付きの変数は、{name1}で定義。
 * ・SpEL式を使う場合は、${EL式}(例. ${#formatter.format('%1.1f',#validatedValue)})で定義。
 *
 */
MessageInterporlator interpolator = new MessageInterporlator();
            
String message = "${#formatter.format('%1.1f',#validatedValue)}は、{min}〜{max}の範囲で入力してください。";

double validatedValue = 3;

Map<String, Object> vars = new HashMap<>();
vars.put("validatedValue", validatedValue);
vars.put("min", 1);
vars.put("max", 10);

String actual = interpolator.interpolate(message, vars);
assertEquals("3.0は、1〜10の範囲で入力してください。", actual);