Usar un ComboBox en un Binder

Hola, a Todos !

Desde hace dos semanas he comenzadoha usar este FrameWork y es excelente lo que se puede realizar, y estoy creando una aplicación para aprender ha usar Vaadin,

Tengo una clase para mostrar un formulario FormLayout, dentro tengo los campos declarados y vinculados usando un Binder, esto funciona ok.
Mi problema es con el uso del ComboBox, ya lo he declarado y se llena con los valores tipo texto, pero necesito que en lugar de guardar el valor de Texto que muestra el comboBox, tome el Id del objeto.

He estado leyendo la documentación y me indica que puedo hacer esto al momento de hacer la declaración del Binder para el comboBox usando WithConverter(), pero no consigo hacer que funcione.

Me explico, en el ComboBox se muestra una lista de Paises, y yo necesito, que cuando se seleccione el pais, no regrese el nombre del Pais sino su Id o otro atributo que se encuentra declarado en la clase (Entity).


public class CondominioForm extends FormLayout {

// Se ha omitido código

 	ComboBox<PaisEntity> cbPais = new ComboBox<>("Pais");
	TextField tfPoBox = new TextField("PoBox");	

	public CondominioForm(List<PaisEntity> paises) {

 		binder.forField(cbPais).bind("direccion.idPais");
		cbPais.setItems(paises);
		cbPais.setItemLabelGenerator(PaisEntity::getNombrePais);
		

Gracias por su ayuda.
Saludos
18517573.png

Hola Juan!

Lo bueno del ComboBox, es que te permite trabajar con el objeto completo y no necesariamente un id. En ese caso algo que podrías hacer es que binder directamente “enlace” el objeto pais dentro del objeto direccion (entonces ni siquiera hace falta lidiar con ids).
En tu código deberías hacer lo siguiente:

binder.forField(cbPais).bind("direccion.pais");

Eso obviamente teniendo en cuenta de que tu objeto direccion tiene a su vez un atributo pais del tipo PaisEntity.

En el caso de que por algún motivo necesites que te lo convierta a un id, entonces deberías crear una clase que implemente la interfaz com.vaadin.data.Converter<PRESENTATION, MODEL> (puedes usar com.vaadin.data.converter.StringToIntegerConverter como un ejemplo) y luego usar el método withConverter como está explicado [en la documentación oficial]
(https://vaadin.com/docs/v14/flow/binding-data/tutorial-flow-components-binder-beans.html#configuring-converters-and-validators).

Saludos!

Hola,
Que buena idea, me ha dado.
Gracias.

Saludos