2

Wicketを使用して検証エラーメッセージをローカライズしようとしていますが、この状況に遭遇しました。カスタムコンバーターを使用して、日付値を目的の形式に変換します(以下を参照)。ただし、を使用するAbstractValidatorIValidationError、値が正しく変換されません。代わりに、デフォルトの変換(おそらく#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」と表示されます。さらに、変換はメッセージ補間とStringResourceModelsでうまく機能します。たとえば、プロパティ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.toStringobject.toString()

4

1 に答える 1

1

バージョン6.0.0では修正されているが1.5では修正されていないWicketのバグのようです(https://issues.apache.org/jira/browse/WICKET-4608)。すぐに改札6に移行することはできないため、自分で修正を実装する必要がありました。現在、Stringアプリケーションのコンバーターを使用して変数をオブジェクトに変換します。

@SuppressWarnings("unchecked")
public static <T> String convert(T value) {
    return Application.get().getConverterLocator().<T>getConverter((Class<T>) value.getClass())
            .convertToString(value, Session.get().getLocale());
}
于 2012-11-22T12:33:06.957 に答える