你可以把你的LocalDate
等模型IModel<java.util.Date>
, e.g.
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;
}
}
Where LocalDateModelButAlsoWrapping
毫不奇怪,这只是一个延伸LocalDateModel
上面的例子,但它也实现了IWrapModel<T>
.
如果您使用此扩展程序而不是常规扩展程序CompoundPropertyModel
它会检测字段何时LocalDate
并为组件提供模型(例如您的DateTextField
)被包裹起来看起来像java.util.Date
models.
我给你的代码片段相当脏(你可能不应该让模型对象推断其类型),因为我只是提供它来说明一般机制,所以我建议你设计自己的方法来推断对象的类型预期(例如,您可以检查是否Component
参数是一个DateTextField
),但这就是我能想象到的解决方案的大方向。