Vaadin如何处理具有非原始属性的JavaBeans

时间:2012-01-12 15:18:21

标签: java gwt javabeans vaadin

我有一个看起来像这样的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?

1 个答案:

答案 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        
    }

}

}