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
相关产品推荐
相关产品推荐

