You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vaadin 24 Grid多行文本列渲染异常:ComponentRenderer等方案失效

问题:Vaadin 24 Grid多行文本渲染异常

我使用Vaadin 24.2.3 + Java 17,浏览器以Chrome为主,也试过其他浏览器。需要渲染一个两列Grid,其中一列要显示多行文本。数据提供者返回值正确,第一列渲染正常,但第二列要么只显示单行且HTML标签被当作文本,要么完全为空,甚至出现JavaScript错误:
There seems to be an error in Vaadin Grid: cannot read properties of undefined (reading 'getbynodeid')

尝试的三种渲染方案

方案1:LitRenderer

messageGrid.addColumn(
        LitRenderer.<JobMessageDetail>of("${item.messages}")
        .withProperty("messages", JobMessageDetail::getMessagesAsString))
    .setHeader("Messages").setWidth("50em");

结果:仅显示单行文本,所有HTML标签被原样输出。

方案2:ComponentRenderer

messageGrid.addColumn(new ComponentRenderer<>(
        i -> {
            Html result =  new Html(i.getMessagesAsString());
            result.setId(String.valueOf(UUID.randomUUID()));
            return result;
        }
        ))
    .setHeader("Messages").setWidth("50em");

结果:触发上述JavaScript错误。

方案3:包含unsafe-html-component的LitRenderer

messageGrid.addColumn(LitRenderer.<JobMessageDetail>of(" <unsafe-html-component .html=${item.html}></unsafe-html-component>")
        .withProperty("html", i -> {
            List<String> strings = List.of("item 1", "item 2", "item 3");
            String listItems = "";
            for (String eventItem : strings) {
                listItems += "<li>"+eventItem +"</li>";
            }
            return listItems;
        }))
        .setHeader("Messages").setWidth("50em");

结果:单元格无任何内容显示。

数据实体类JobMessageDetail

@Getter
@Setter
@AllArgsConstructor
public class JobMessageDetail {
    private String identifier;
    private List<JobMessage> messages;

    public String getMessagesAsString() {
        return "<div>" + messages.stream()
                .map(x -> StringUtils.join("<b>", x.getMessageCode(), "</b>: ", x.getProperties()))
                .collect(Collectors.joining("<br>\n")) + "</div>";
    }
}

后续尝试与排查

  • 现有解决方案多针对Vaadin 14及更早版本,不适用于当前版本。
  • 添加messageGrid.addThemeVariants(GridVariant.LUMO_WRAP_CELL_CONTENT);后文本可自动换行,但无法通过\n或<br>自定义换行位置。
  • 移除Spring Java Live Reload依赖后,ComponentRenderer可正常工作,怀疑两者存在冲突。

内容的提问来源于stack exchange,提问作者Uwe Allner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 14:55:37