java - 如何使 Wicket 7 与 Java 8 中的 java.time 一起工作?

标签 java converter wicket

我有很多 bean,并且都使用 LocalDate 和 LocalDateTime。 Wicket 中的 DateTextField 和所有其他小部件(如 DatePicker)仅适用于 java.util.Date。有没有办法注入(inject)一个转换器到 Wicket 7 中,以便它使用 LocalDate 或 LocalDateTime?

bean 看起来像这样:

public class SomeBean {
  Long id = null;
  LocalDate since = null;
  // plus getters and setters
}

Wicket 表单当前使用 CompoundPropertyModel

CompoundPropertyModel<SomeBean> model = new CompundPropertyModel<>( bean );

最佳答案

你可以包装你的 LocalDate等模型在 IModel<java.util.Date> ,例如

public static class LocalDateModel implements IModel<java.util.Date> {
    private IModel<LocalDate> localDateModel;
    public LocalDateModel(IModel<LocalDate> localDateModel){
        this.localDateModel = localDateModel;
    }


    @Override
    public Date getObject() {
        return convertLocalDateToUtilDateSomehow(localDateModel.getObject());
    }

    @Override
    public void setObject(Date object) {
        localDateModel.setObject(convertUtilDateToLocalDateSomehow(object));
    }

    @Override
    public void detach() {
        localDateModel.detach();
    }
}

如果您随后将这样的模型输入到您要使用的表单组件中,它应该可以正常工作。

如果你想要你的 CompoundPropertyModel要自动提供此类包装模型,您需要扩展它并覆盖它的 CompoundPropertyModel#wrapOnInheritance(Component component)推断需要包装模型的方法。有点像

@Override
public <C> IWrapModel<C> wrapOnInheritance(Component component)
{
    IWrapModel<C> actualModel = super.wrapOnInheritance(component);
    if (actualModel.getObject() instanceOf LocalDate) {
        return new LocalDateModelButAlsoWrapping(actualModel);
    } else {
        return actualModel;
    }
}

在哪里LocalDateModelButAlsoWrapping毫不奇怪,它只是 LocalDateModel 的延伸上面的示例,但它也实现了 IWrapModel<T> .

如果您使用此扩展程序而不是常规的 CompoundPropertyModel它会检测字段何时为 LocalDate并为包装成看起来像 DateTextField 的组件(例如您的 java.util.Date )提供模型模型。

虽然我给你的代码片段很脏(你可能不应该让模型对象推断它的类型)因为我提供它只是为了说明一般机制,所以我建议你设计自己的方式来推断预期的对象类型(例如,您可以检查 Component 参数是否为 DateTextField ),但这是我可以想象的解决方案的总体方向。

关于java - 如何使 Wicket 7 与 Java 8 中的 java.time 一起工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39162334/

相关文章:

java - 如何使用Java检查HDFS中的文件是否已更新?

java - 如何将字符串转换为 ArrayList?

javascript - 将 markdown 转换为 json 对象

javascript - 如何在 PHP 中将 JavaScript 文字对象转换为 Json 对象

wicket - 在 Wicket 网页中使用 EJB

javascript - 如何在 AjaxLink (Wicket) 的 onSubmit 方法中调用 Ajaxdecorator 或 javascript

java - 将列表分成更小的部分(可能使用 Wicket 口)

java - Java字节码编程

java - Java 中的工厂类 - Android

Java 和 dom (org.dom4j)