我有一个看起来像这样的Bean
Class Person{
private String name;
private int age
private Properties attributes
public String getName() { return name; }
public int getAge() { return age; }
public Properties getAttributes () { return attributes; }
public void setName(String name) { this.name=name; }
public void setAge(int age) { this.age=age; }
public void setAttributes (Properties attributes) { this.attributes = attributes; }
}
尝试使用Vaadin Forms来编辑Bean,我使用
将Bean分配给表单form.setItemDataSource(new BeanItem<Person>(person));
表单显示正确,显示“{eye.colour = green,hair.colour = brown}”的属性 但是,当尝试提交任何更改时,会针对属性抛出转换错误。 Init&gt;没有字符串构造函数。
Vaadin Forms如何处理具有非基本类型属性的Bean?
答案 0 :(得分:2)
您必须通过扩展DefaultFieldFactory为表单创建自定义fieldfactory。
请参阅https://vaadin.com/book/-/page/components.form.html(有关如何执行此操作的页面的一半)。这将允许您覆盖生成表单字段的默认方式。但是,这并不能提供一种简单的方法来处理您想要的自定义字段和转换。
幸运的是,我使用了一个很好的扩展,可以轻松创建名为自定义字段插件的自定义字段和属性转换。
https://vaadin.com/directory#addon/customfield
使用此组件,您可以轻松扩展现有字段并添加自定义转化。
由于没有很多关于如何执行此操作的示例,下面是一个示例,说明自定义FieldFactory的各个部分如何与自定义字段协同工作。
公共类CustomFieldFactory扩展了DefaultFieldFactory {
public DefaultProfileTableFieldFactory() {
}
@Override
public Field createField(Container container, Object itemId, Object propertyId, Component uiContext) {
if (propertyId.equals(YOURCUSTOMPROP)) {
Select select = new Select();
select.addItem(ITEM1);
select.addItem(ITEM2);
select.addItem(ITEM3);
return new SelectCustomField(select, String.class);
} else {
return super.createField(container, itemId, propertyId, uiContext);
}
}
private static class SelectCustomField extends FieldWrapper<String> {
protected SelectCustomField(Field wrappedField, Class<? extends String> propertyType) {
super(wrappedField, propertyType);
VerticalLayout l = new VerticalLayout();
l.addComponent(wrappedField);
setCompositionRoot(l);
l.setSizeUndefined();
this.setSizeUndefined();
wrappedField.setSizeUndefined();
}
@Override
protected String parse(Object value) throws ConversionException {
// parse value from select to your model
}
@Override
protected Object format(String value) {
// format model from your model to value to be shown
}
}
}