Wicket ValidationError не использует IConverters, указанные в приложении

Я пытаюсь локализовать сообщения об ошибках проверки с помощью Wicket и столкнулся с этой ситуацией. Я использую пользовательские конвертеры для преобразования значений даты в нужный формат (см. ниже). Однако при использовании AbstractValidator и IValidationError значения преобразуются неправильно. Вместо этого используется преобразование по умолчанию — вероятно, #toString().

Требуемое сообщение об ошибке "... 20.12.2012"

Фактическое сообщение об ошибке "... 2012-12-20"

Мы используем Joda-time для обработки значений даты и времени в нашей модели. Мы также хотим, чтобы даты и время отображались на финском языке независимо от того, какой язык отображается пользователю, т. е. даты отображались как d.m.yyyy, а время — как hh:mm.

В моем классе Application я указал два преобразователя типов: один для LocalDate, а другой для LocalTime. В норме оба преобразователя работают нормально. То есть new Label("id", new LocalDate(2013, 5, 7)); отображается как "7.5.2013". Кроме того, преобразование отлично работает с интерполяцией сообщений и StringResourceModels. Например. свойство prop=The date was: ${date} отображается правильно как «Дата была 20.12.2012».

Логика проверки даты выполняется на бизнес-уровне, где возникает исключение для ошибки проверки. Исключение может содержать переменные, которые необходимо показать пользователю в качестве обратной связи. Ниже приведен упрощенный пример ситуации.

Класс приложения

@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(). Еще нужно выяснить, как это нормально работает.


person RJo    schedule 22.11.2012    source источник


Ответы (1)


Кажется, это ошибка с Wicket, которая исправлена ​​в версии 6.0.0, но не в 1.5 (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());
}
person RJo    schedule 22.11.2012