Vaadin BeanFieldGroup - 绑定嵌套属性时“属性未级联”

时间:2016-12-14 10:00:13

标签: java vaadin

我一直在这里和Vaadin论坛上搜索几个小时,但我似乎在这里有一个独特的问题。

为了能够轻松地说明,我简化了我的问题。 所以我有一个Bean类:

public class Bean {
    private String name;
    private NestedBean nestedBean;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public NestedBean getNestedBean() {
        return nestedBean;
    }

    public void setNestedBean(NestedBean nestedBean) {
        this.nestedBean = nestedBean;
    }

    Bean() {
        this.name = "Bean";
        this.nestedBean = new NestedBean();
    }
}

及其嵌套字段,类NestedBean:

public class NestedBean {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    NestedBean() {
        this.name = "NestedBean";
    }
}

所以现在我想在BeanFieldGroup的帮助下将Bean实例绑定到两个TextField:

Bean bean = new Bean();

BeanFieldGroup<Bean> binder = new BeanFieldGroup<>(Bean.class);
binder.setItemDataSource(bean);

addComponent(binder.buildAndBind("Name", "name"));
addComponent(binder.buildAndBind("Nested name", "nestedBean.name"));

然而,这引发了这个例外:

java.lang.IllegalArgumentException: Property com.reygok.vaadin.main.Bean.nestedBean is not cascaded

Caused by: org.apache.bval.jsr.UnknownPropertyException: Property com.reygok.vaadin.main.Bean.nestedBean is not cascaded

我尝试了不同的解决方案,例如:

首先创建TextFields,然后使用

binder.bind(textField, "nestedBean.name");

首先这样做:

binder.getItemDataSource().addNestedProperty("nestedBean.name");

但是没有改变异常。那么有人知道是什么原因造成的吗?

提前多多感谢!

2 个答案:

答案 0 :(得分:1)

我找到了,所以如果其他人有同样的问题:

解决方案是将@Valid注释添加到其中包含嵌套字段的字段中。

所以在我的例子中:

public class Bean {
   private String name;

   @Valid
   private NestedBean nestedBean;
...

答案 1 :(得分:0)

我建议你在设置bean数据源之前绑定成员

BeanFieldGroup<Bean> binder = new BeanFieldGroup<>(Bean.class);

// first
addComponent(binder.buildAndBind("Name", "name"));
addComponent(binder.buildAndBind("Nested name", "nestedBean.name"));
// then
binder.setItemDataSource(bean);