我有很多 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/