2

我正在尝试使用 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”​​。此外,转换与消息插值和StringResourceModels 配合得很好。例如,属性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()。仍然需要了解它是如何正常工作的。

4

1 回答 1

1

似乎这是在 6.0.0 版中修复的 Wicket 的一个错误,但在 1.5 版中未修复(https://issues.apache.org/jira/browse/WICKET-4608)。由于我们无法立即迁移到 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());
}
于 2012-11-22T12:33:06.957 回答