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

Vaadin 24.6.0中ComponentRenderer无默认构造函数的适配问题

Vaadin 24.6 ComponentRenderer 无默认构造问题解决指南

问题背景

Vaadin 24.6 移除了ComponentRenderer的无参默认构造函数,要求必须通过传入序列化函数/供应商类型的参数完成初始化,这是为了适配框架的服务端序列化机制(Vaadin前后端通信依赖对象序列化能力)。

核心接口说明

1. SerializableFunction<T, R>

这是Java标准Function<T,R>的序列化兼容版本,作用是接收一个输入对象(比如你的Book实例),返回一个渲染后的组件(比如UnorderedList)。它的核心要求是:逻辑代码必须能被序列化,确保Vaadin可以在服务端和客户端之间传递这个渲染逻辑。

基础用法示例:

// 定义一个从Book生成UnorderedList的序列化函数
SerializableFunction<Book, UnorderedList> authorRenderer = book -> {
    // 编写组件生成逻辑
    return new UnorderedList();
};

2. SerializableSupplier<T>

这是Java标准Supplier<T>的序列化兼容版本,不需要输入参数,直接返回一个组件实例。适用于不需要依赖数据源的静态渲染场景(比如固定文本、通用按钮)。

基础用法示例:

// 定义一个生成静态按钮的序列化供应商
SerializableSupplier<Button> staticButton = () -> new Button("查看详情");

你的代码修改方案

原来通过重写createComponent的子类实现,现在可以将渲染逻辑封装为SerializableFunction,传入父类构造函数即可:

public class AuthorListRenderer extends ComponentRenderer<UnorderedList, Book> {
    
    public AuthorListRenderer() {
        // 将原createComponent逻辑作为SerializableFunction传入父类构造
        super(source -> {
            Set<Author> authors = source.getAuthors();
            ListItem[] items = new ListItem[authors.size()];
            int i = 0;
            for (Author author : authors) {
                String item = ((author.getFirstName() == null) ? "" : (author.getFirstName() + " "))
                        + author.getLastName() + ((author.getNickName() == null) ? "" : (" (" + author.getNickName() + ")"));
                ListItem listItem = new ListItem(item);
                listItem.getStyle().set("font-style", "italic");
                listItem.getStyle().set("white-space", "normal");
                items[i++] = listItem;
            }
            return new UnorderedList(items);
        });
    }
}

简化替代方案(无需自定义类)

如果这个渲染器不需要跨多处复用,也可以直接在Grid列定义时内联编写逻辑,省去单独创建AuthorListRenderer类的步骤:

grid.addColumn(new ComponentRenderer<>(book -> {
    Set<Author> authors = book.getAuthors();
    ListItem[] items = new ListItem[authors.size()];
    int i = 0;
    for (Author author : authors) {
        String item = ((author.getFirstName() == null) ? "" : (author.getFirstName() + " "))
                + author.getLastName() + ((author.getNickName() == null) ? "" : (" (" + author.getNickName() + ")"));
        ListItem listItem = new ListItem(item);
        listItem.getStyle().set("font-style", "italic");
        listItem.getStyle().set("white-space", "normal");
        items[i++] = listItem;
    }
    return new UnorderedList(items);
})).setHeader("作者列表");

内容的提问来源于stack exchange,提问作者Gary Greenberg

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 04:40:55