Wicket ValidationError不使用Application中指定的IConverters

时间:2012-11-22 11:33:43

标签: validation localization wicket wicket-1.5

我正在尝试使用Wicket本地化验证错误消息并遇到这种情况。我使用自定义转换器将日期值转换为所需的格式(见下文)。但是,使用AbstractValidatorIValidationError时,值无法正确转换。使用默认转换 - 可能是#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;
}

Validator类

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}}。仍然需要了解它是如何正常工作的。

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());
}