我有一个 bean,我使用 Model 将它附加到表单上,它工作正常。我也有一个像 bean 的字段Map<String, javax.mail.Address>
。考虑到每个地图条目都应该像这样,我如何按模型将此字段与表单绑定Label: TextField
?
提前致谢。
也许是这样的:
ListView<String> textAreasListView = new ListView<String>("someid", bean.map.keySet()) {
@Override
protected void populateItem(final ListItem<String> itemLang) {
itemLang.add(new Label("label", itemLang.getModelObject()));
Model<String> textModel = new Model<String>() {
@Override
public String getObject() {
return bean.map.get(itemLang.getModelObject()).toString;
}
@Override
public void setObject(String object) {
bean.map.put(itemLang.getModelObject(), new Address(object));
}
};
itemLang.add(new TextField<String>("email", textModel));
}
};
并将其添加到您的表单中。
地址和字符串的自定义转换器将是一个额外的改进。
我认为,您可以通过以下方式绑定它:
TextField<Address> textField = new TextField<Address>("address",
beanModel.<Address> bind("addressMap[addressKey]"), Address.class) {
@SuppressWarnings("unchecked")
@Override
public <C> IConverter<C> getConverter(Class<C> type) {
if (Address.class.isAssignableFrom(type)) {
return (IConverter<C>) new AddressConverter();
} else {
return super.getConverter(type);
}
}
};
form.add(textField);
这里“addressMap”是映射字段的名称,“addressKey”是映射中地址值的键。
AddressConverter 类的清单:
public class AddressConverter implements IConverter<Address> {
public Address convertToObject(String string, Locale locale) {
try {
return new InternetAddress(string);
} catch (AddressException e) {
return null;
}
}
public String convertToString(Address address, Locale locale) {
return address.toString();
}
}
当然,Address 类的转换器可以与 ConverterLocator 全局附加。只需将以下方法添加到您的 Application 类:
@Override
protected IConverterLocator newConverterLocator() {
ConverterLocator locator = new ConverterLocator();
locator.set(Address.class, new AddressConverter());
return locator;
}
然后您不需要在所有文本字段上覆盖 getConverter() 方法。