He estado buscando durante horas aquí y en los foros de Vaadin, pero parece que tengo un problema único aquí.

Simplifiqué mucho mi problema para poder ilustrarlo fácilmente. Entonces tengo una clase de 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();
    }
}

Y su campo anidado, clase NestedBean:

public class NestedBean {
    private String name;

    public String getName() {
        return name;
    }

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

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

Así que ahora quiero vincular una instancia de Bean a dos campos de texto, con la ayuda de un grupo BeanField:

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"));

Sin embargo, esto arroja esta excepción:

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

Probé diferentes soluciones, como:

Creando los TextFields primero y luego usando

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

Haciendo esto primero:

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

Pero nada cambió la Excepción. Entonces, ¿alguien sabe qué causa esto?

¡Muchas gracias por adelantado!

0
Reygok3 14 dic. 2016 a las 13:00

2 respuestas

La mejor respuesta

Lo encontré, así que si otros tienen el mismo problema:

La solución es agregar la anotación @Valid a los campos que tienen campos anidados dentro de ellos.

Entonces en mi ejemplo:

public class Bean {
   private String name;

   @Valid
   private NestedBean nestedBean;
...
1
Reygok3 14 dic. 2016 a las 12:26

Te recomiendo vincular el miembro antes de configurar la fuente de datos del 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);
0
fisc 14 dic. 2016 a las 10:18