Я пытаюсь локализовать сообщения об ошибках проверки с помощью 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". Кроме того, преобразование отлично работает с интерполяцией сообщений и StringResourceModel
s. Например. свойство 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()
. Еще нужно выяснить, как это нормально работает.