Vaadin使用Binder绑定继承抽象类的实体新建实例失败如何解决?
解决方案
针对你的需求,最简洁规范的方案分为两种,按适用场景选择即可:
方案1:自定义CRUD组件新建项逻辑(推荐,适配你当前使用CRUD组件的场景)
Vaadin的CRUD组件支持手动指定新建条目时的实例生成逻辑,你只需要添加1行代码配置newItemProvider,直接返回你需要的User实例即可,完全避免触发Binder反射实例化抽象类的逻辑:
// 假设你原有CRUD初始化代码如下 Crud<AbstractUser> crud = new Crud<>(AbstractUser.class, userEditor); // 新增这一行配置新建逻辑 crud.setNewItemProvider(() -> new User());
该方案无侵入性,原有编辑Admin、SuperAdmin实例的逻辑完全不需要修改,所有字段绑定逻辑正常生效,完全符合你「仅允许创建User类型用户、兼容所有角色的编辑维护」的需求。
方案2:给Binder指定实例工厂(适用于单独使用Binder不绑定CRUD的场景)
如果你是单独使用Binder而没有走CRUD组件的封装,可以在初始化Binder时传入自定义的Bean工厂,指定新建实例时返回User:
Binder<AbstractUser> binder = new Binder<>(AbstractUser.class, () -> new User());
这样Binder在需要生成新实例时会调用你传入的工厂方法,不会尝试反射实例化抽象类AbstractUser。
内容的提问来源于stack exchange,提问作者Ondřej Kozel
相关产品推荐
相关产品推荐

