我正在尝试使用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}
正确显示为“日期为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()
又调用{{1}}。仍然需要了解它是如何正常工作的。
答案 0 :(得分:1)
似乎它是Wicket的一个错误,它在6.0.0版本中修复,但在1.5(https://issues.apache.org/jira/browse/WICKET-4608)中没有修复。由于我们不能立即迁移到wicket 6,我们需要自己实施修复。目前,它使用Application的转换器将变量转换为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());
}