BeanFieldGroup с ComboBox?

Я пытаюсь создать компонент ComboBox, используя BeanFieldGroup в своем приложении, но все еще не могу это сделать. Сначала я попытался создать поле со списком, а затем добавить это поле со списком в buildAndBind, но оно также не работает.

Я пытаюсь это:

/** person's bean */
@Entity
public class Person{

@Id
@GeneratedValue
private Integer id;

@NotNull
@NotEmpty
@Size(min=5, max=50, message="insert first name")
private String firstName;

@NotNull
@NotEmpty
@Email private String email;

//female or male
private String gender;

//get and set
}

/** app */
public class PersonView extends CustomComponent{
private final BeanFieldGroup<Person> binder = new BeanFieldGroup<Person>(Person.class);
private Person bean = new Person();

    private ComboBox gender;

    public PersonView(){
         VerticalLayout vLayout = new VerticalLayout();
         Field<?> field = null;
         field = binder.buildAndBind("Gender", "gender", ComboBox.class);
         gender = (ComboBox)binder.getField("gender");
         gender.addItem("Male");
         gender.addItem("Female");
         vLayout.addComponent(gender);
    }
}

Исключение:

/** exception /*
Caused by: com.vaadin.data.fieldgroup.FieldGroup$BindException: Unable to build a field of type com.vaadin.ui.ComboBox for editing java.lang.String
    at com.vaadin.data.fieldgroup.FieldGroup.build(FieldGroup.java:1067)
    at com.vaadin.data.fieldgroup.FieldGroup.buildAndBind(FieldGroup.java:1039)
    at br.ind.ibg.views.CurriculumView.buildLayout(CurriculumView.java:50)
    at br.ind.ibg.views.CurriculumView.<init>(CurriculumView.java:32)
    at br.ind.ibg.views.LoginView.buttonClick(LoginView.java:84)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at com.vaadin.event.ListenerMethod.receiveEvent(ListenerMethod.java:508)
    ... 37 more

Как я это делаю?


person FernandoPaiva    schedule 15.04.2014    source источник
comment
хорошо, я отредактировал и добавил рассматриваемое исключение.   -  person FernandoPaiva    schedule 15.04.2014


Ответы (1)


Это хороший вопрос! После некоторого расследования я нашел следующее решение:

Вы должны создать свою собственную FieldGroupFieldFactory (почему см. ниже):

binder.setFieldFactory(new DefaultFieldGroupFieldFactory() {

    @Override
    public <T extends Field> T createField(Class<?> type, Class<T> fieldType) {

        if (type.isAssignableFrom(String.class) && fieldType.isAssignableFrom(ComboBox.class)) {
            return (T) new ComboBox();
        }

        return super.createField(type, fieldType);
    }

});

Причина почему:

Если вы посмотрите исходный код vaadin DefaultFieldGroupFieldFactory .java вы увидите, что в конце концов ComboBox будет создан только в том случае, если вы укажете Enum как «источник данных свойства». Вы предоставляете строку, поэтому DefaultFieldGroupFieldFactory хочет создать TextField. Но вы предоставили ComboBox. В конце возникает исключение.

С вашей собственной фабрикой это будет работать. Не забудьте setItemDataSource(bean) и commit() подшивку, чтобы указать пол боба.

person nexus    schedule 15.04.2014
comment
У меня есть вопрос. С отношениями jpa, как мне создать ComboBox со значениями отношений? Пример отношения: ManyToOne ... Использование JPAContainer - person FernandoPaiva; 16.04.2014
comment
Ответ на этот вопрос можно найти здесь: stackoverflow.com/questions/23117547/ - person nexus; 24.04.2014