我正在尝试使用 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()
。仍然需要了解它是如何正常工作的。