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

