在网格 ComponentRenderer 中使用时 ComboBox 的 Vaadin 12 ItemLabelGenerator

Vaadin 12 ItemLabelGenerator of ComboBox when used in grid ComponentRenderer

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

在我的网格中,我有一个呈现的列来显示 ComboBoxItemLabelGenerator 有一个奇怪的问题。我定义如下:

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

这在 Vaadin 11.0.2 中运行良好,但现在项目标签显示为 package.path.to.myobject.MyObject@41d8d522 而不是 gridItem.getMyObject();
的实际名称 当我点击 ComboBox 显示所有选项时,标签是正确的!但是一旦我 select 一个,它就会变成前面提到的错误字符串。

重要细节:出于测试原因,我现在添加了一个具有相同设置的类似 ComboBox 到一个简单的 VerticalLayout(也就是不在网格中),然后一切正常。这就是为什么我认为问题出在 ComponentRenderer 而不是单独 ComboBox

这是一个错误,还是我在升级到 12.0.0 时遗漏了什么?

vaadin blog post about the new release of Vaadin 12 中,我看到有一项已知的重大更改,它与组合框有关:

If you are coming from Vaadin 10 or 11, you should update the platform dependency in your project build file. The only breaking change we introduced was because ComboBox now supports server-side lazy-loading. If you are using filtering with a ComboBox see instructions on fixing the possible compilation issue.

但是,我的案例没有涉及任何过滤。

这个答案是 Diego Sanz Villafruela in the Vaadin Forum 写的,我也在那里提出了这个确切的问题。

I created an example similar to yours and I discover that the order in which you set the value and the ItemLabelGenerator matters.

You should put comboBox.setValue after setting the comboBox.setItemLabelGenerator.

Otherwise the method String.valueOf(obj) will be called the first time, giving you the object's representation (MyObject@41d8d522) and not the name.