Как Vaadin может обрабатывать JavaBeans с не примитивными атрибутами - PullRequest
0 голосов
/ 12 января 2012

У меня есть Боб, который выглядит так

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, чтобы разрешить редактирование Бина, я назначаю Бин форме, используя

form.setItemDataSource(new BeanItem<Person>(person));

Форма отображается правильно с атрибутами, показывающими «{eye.colour = green, hair.colour = brown}» Но при попытке зафиксировать какие-либо изменения выдается ошибка преобразования в отношении Свойства. не имеет строкового конструктора .

Как Vaadin Forms может обрабатывать Бины со свойствами не примитивных типов?

1 Ответ

2 голосов
/ 23 января 2012

Вам нужно создать собственную форму поля для формы, расширив DefaultFieldFactory.

См. https://vaadin.com/book/-/page/components.form.html (на полпути на странице о том, как это сделать). Это позволит вам переопределить способ генерации полей формы по умолчанию. Это, однако, не обеспечивает простой способ обрабатывать пользовательские поля и преобразования так, как вы хотите.

К счастью, есть хорошее расширение, которое я использую, чтобы легко создавать настраиваемые поля и преобразования свойств, называемые плагином настраиваемых полей.

https://vaadin.com/directory#addon/customfield

С помощью этого компонента вы можете легко расширять существующие поля и добавлять пользовательские преобразования.

Поскольку примеров того, как это сделать, не так много, ниже приведен пример того, как различные части пользовательского FieldFactory и пользовательского поля работают вместе.

открытый класс CustomFieldFactory extends 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        
    }

}

}

...