Wicket的源代码有很好的文档记录和不言自明。 Label 正在使用 getDefaultModelObjectAsString() 从 Component 看起来像这样:
Label
getDefaultModelObjectAsString()
Component
// Get converter final Class<?> objectClass = modelObject.getClass(); final IConverter converter = getConverter(objectClass); // Model string from property final String modelString = converter.convertToString(modelObject, getLocale());
所以在这里你可以看到Wicket使用了 IConverter 将模型对象转换为 String 。看一下默认的实现 ConverterLocator 如果你还没有注册,你会看到 IConverter 对于这种类型的对象,Wicket将使用 DefaultConverter 用的 org.apache.wicket.util.lang.Objects 将对象转换为的静态方法 String 。
IConverter
String
ConverterLocator
DefaultConverter
org.apache.wicket.util.lang.Objects
该 TextField 也使用了 IConverter 将对象转换为 String 从... String 再次对象。不同之处在于Wicket能够始终将未知类转换为 String 使用 toString 方法,但不是其他方式。所以,如果你想使用一个 IModel<Person> 用一个 TextField 你需要注册自己的 IConverter<Person> 实现。
TextField
toString
IModel<Person>
IConverter<Person>