用于网格组件渲染器时,组合框的Vaadin 12 ItemLabelGenerator

用于网格组件渲染器时,组合框的Vaadin 12 ItemLabelGenerator,vaadin,vaadin-flow,vaadin12,Vaadin,Vaadin Flow,Vaadin12,今天,我已经从Vaadin 11.0.2升级到12.0.0-一切都很顺利,除了一件事: 在我的一个网格中,我有一个渲染列来显示一个组合框,在ItemLabelGenerator中有一个奇怪的问题。我将其定义如下: grid.addColumn(new ComponentRenderer<>(gridItem -> { ComboBox<MyObject> comboBox = new ComboBox<>(); comboBox.set

今天,我已经从Vaadin 11.0.2升级到12.0.0-一切都很顺利,除了一件事:

在我的一个网格中,我有一个渲染列来显示一个
组合框
,在
ItemLabelGenerator
中有一个奇怪的问题。我将其定义如下:

grid.addColumn(new ComponentRenderer<>(gridItem -> {

    ComboBox<MyObject> comboBox = new ComboBox<>();
    comboBox.setItems(myObjectsService.findAll());
    comboBox.setValue(gridItem.getMyObject());
    comboBox.setItemLabelGenerator(MyObject::getName); // MyObject::getName returns String
    // comboBox.addValueChangeListener omitted
    return comboBox;

}))
    .setHeader("MyObject")
    .setId("myObject");
grid.addColumn(新组件渲染器(gridItem->{
ComboBox ComboBox=新建ComboBox();
setItems(myObjectsService.findAll());
setValue(gridItem.getMyObject());
comboBox.setItemLabelGenerator(MyObject::getName);//MyObject::getName返回字符串
//comboBox.addValueChangeListener省略
返回组合框;
}))
.setHeader(“MyObject”)
.setId(“myObject”);
这在Vaadin 11.0.2中运行良好,但现在项目标签显示为
package.path.to.myobject。MyObject@41d8d522
而不是
gridItem.getMyObject()的实际名称
当我点击组合框显示所有选项时,标签是正确的!但只要我选择一个,它就会变成前面提到的错误字符串

重要细节:出于测试原因,我现在在一个简单的
垂直布局中添加了一个类似的组合框,具有相同的设置
(也称为不在网格中),在那里一切都很好。这就是为什么我认为问题出在
组件渲染器
上,而不仅仅是
组合框

这是一个bug,还是升级到12.0.0时遗漏了什么

在中,我看到一个已知的中断更改,它与ComboBox有关:

如果您来自Vaadin 10或11,则应在项目构建文件中更新平台依赖项。我们引入的唯一突破性更改是因为ComboBox现在支持服务器端延迟加载。如果使用组合框过滤,请参阅有关修复可能的编译问题的说明

然而,我的案例中没有涉及任何过滤。

这个答案是作者写的,我在那里也提出了这个确切的问题

我创建了一个类似于您的示例,我发现 您设置的值和ItemLabelGenerator很重要

您应该在设置
comboBox.setItemLabelGenerator

否则,将首先调用方法String.valueOf(obj) 时间,为您提供对象的表示(MyObject@41d8d522)及 不是名字

我创建了一个,因为这个答案只是一个bug的解决方法。