Wicketを使用して検証エラーメッセージをローカライズしようとしていますが、この状況に遭遇しました。カスタムコンバーターを使用して、日付値を目的の形式に変換します(以下を参照)。ただし、を使用するAbstractValidator
とIValidationError
、値が正しく変換されません。代わりに、デフォルトの変換(おそらく#toString()
)が使用されます。
必要なエラーメッセージ「... 2012年12月20日」
実際のエラーメッセージ「... 2012-12-20」
モデルの日付と時刻の値を処理するためにJoda-timeを使用します。また、ユーザーに表示される言語に関係なく、日付と時刻がフィンランド語ロケールで表示されるようにする必要があります。つまり、日付d.m.yyyy
と時刻はとして表示されhh:mm
ます。
私のApplicationクラスでは、2つのタイプコンバーターを指定しました。1つは用LocalDate
、もう1つは用LocalTime
です。通常、両方のコンバーターは正常に動作します。new Label("id", new LocalDate(2013, 5, 7));
つまり、「7.5.2013」と表示されます。さらに、変換はメッセージ補間とStringResourceModel
sでうまく機能します。たとえば、プロパティprop=The date was: ${date}
は「日付は2012年12月20日でした」と正しく表示されます。
日付検証ロジックはビジネスレイヤーで実行され、検証エラーに対して例外がスローされます。例外には、ユーザーへのフィードバックとして表示する必要のある変数が含まれている場合があります。以下は、状況の簡略化された例です。
アプリケーションクラス
@Override
protected IConverterLocator newConverterLocator() {
final ConverterLocator locator = new ConverterLocator();
locator.set(LocalDate.class, new LocalDateConverter());
locator.set(LocalTime.class, new LocalTimeConverter());
return locator;
}
バリデータークラス
public class MyDateValidator extends AbstractValidator<LocalDate> {
...
@Override
protected void onValidate(IValidatable<LocalDate> validatable) {
try {
service.validateDate(validatable.getValue());
} catch (MyValidationException e) {
Map<String, Object> values = new HashMap<String, Object>();
values.put("date", e.getDate());
error(validatable, "DateValidator", values);
}
}
変換されたプロパティ
DateValidator=There was an error on ${date}
編集:
犯人は、どちらが順番に呼び出すかMapVariableInterpolator#getValue(variableName)
を使用しているようです。それでも、それが通常どのように機能するかを知る必要があります。Strings.toString
object.toString()