Wicket ValidationError未使用应用程序中指定的IConverter

Wicket ValidationError未使用应用程序中指定的IConverter,validation,localization,wicket,wicket-1.5,Validation,Localization,Wicket,Wicket 1.5,我试图用Wicket本地化验证错误消息,但遇到了这种情况。我使用自定义转换器将日期值转换为所需格式(见下文)。但是,当使用AbstractValidator和IValidationError时,值转换不正确。使用默认转换-可能是#toString()-代替 所需错误消息“…20.12.2012” 实际错误消息“…2012-12-20” 我们使用Joda time来处理模型中的日期和时间值。我们还希望无论向用户显示哪种语言,日期和时间都以芬兰语显示,即日期显示为d.m.yyyy,时间显示为hh:m

我试图用Wicket本地化验证错误消息,但遇到了这种情况。我使用自定义转换器将日期值转换为所需格式(见下文)。但是,当使用
AbstractValidator
IValidationError
时,值转换不正确。使用默认转换-可能是
#toString()
-代替

所需错误消息“…20.12.2012”

实际错误消息“…2012-12-20”

我们使用Joda time来处理模型中的日期和时间值。我们还希望无论向用户显示哪种语言,日期和时间都以芬兰语显示,即日期显示为
d.m.yyyy
,时间显示为
hh:mm

在我的应用程序类中,我指定了两种类型的转换器,一种用于
LocalDate
,另一种用于
LocalTime
。通常,两个转换器都工作正常。即,
新标签(“id”,新本地日期(2013年5月7日))显示为“7.5.2013”。此外,通过消息插值和
StringResourceModel
s,这种转换非常有效。例如,属性
prop=日期为:${date}
正确显示为“日期为2012年12月20日”

日期验证逻辑在业务层中完成,在业务层中,验证错误会引发异常。异常可能包含需要显示为用户反馈的变量。下面是一个简化的情况示例

应用程序类 验证器类 编辑


罪魁祸首似乎是
MapVariableInterpolator#getValue(variableName)
,它使用
Strings.toString
,依次调用
object.toString()
。仍然需要了解它是如何正常工作的。

似乎这是Wicket的一个bug,在版本6.0.0中已修复,但在1.5()中未修复()。因为我们不能直接迁移到wicket 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());
}
@SuppressWarnings(“未选中”)
公共静态字符串转换(T值){
返回应用程序.get().getConverterLocator().getConverter((类)值.getClass())
.convertToString(值,Session.get().getLocale());
}
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}
@SuppressWarnings("unchecked")
public static <T> String convert(T value) {
    return Application.get().getConverterLocator().<T>getConverter((Class<T>) value.getClass())
            .convertToString(value, Session.get().getLocale());
}