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

Vaadin Binder仅在保存时设置Bean及撤销功能实现咨询

Vaadin Binder实现带撤销功能的表单解决方案

核心问题解决方案

1. Binder初始化方式

要实现“修改暂存、保存才更新原Bean、撤销放弃修改”的需求,需利用Binder的草稿模式(Draft Mode)。初始化时先将原始Bean的数据加载到表单,同时启用草稿模式,用户在表单中的修改会暂存在Binder草稿中,不会直接改动原Bean。

正确初始化代码:

private MyBean myBean; // 预先加载好初始数据的实体类实例
private Binder<MyBean> binder = new Binder<>(MyBean.class);

private void initBinder() {
    // 启用草稿模式,表单修改暂存,不直接写入原Bean
    binder.setBeanAsDraft(myBean);
    // 将原Bean的初始值加载到所有绑定的表单字段
    binder.readBean(myBean);
    
    // 正常绑定字段(示例)
    binder.forField(inputField)
          .bind(MyBean::getValue, MyBean::setValue);
    // 其他字段绑定逻辑同理...
}

2. 保存方法获取更新后的Bean

保存时先验证表单数据有效性,验证通过后将Binder草稿中的修改写入原Bean,此时原Bean即为更新后的状态,直接用于数据库存储即可。

正确保存方法:

private void save() {
    try {
        // 将草稿中验证通过的数据写入原Bean
        binder.writeBean(myBean);
        // 此时myBean已更新,直接执行数据库保存逻辑
        // saveToDatabase(myBean);
    } catch (ValidationException e) {
        // 处理验证失败逻辑,如弹出提示
        Notification.show("表单验证失败,请检查输入内容");
    }
}

3. 撤销方法实现

撤销时只需将原Bean的初始数据重新加载到表单,同时清空Binder的草稿,表单会自动恢复到初始状态,原Bean不会被修改。

正确撤销方法:

private void cancel() {
    // 重新加载原Bean的初始值到表单,自动清空草稿
    binder.readBean(myBean);
    // 无需手动设置单个字段值,readBean会同步所有绑定字段
}

原代码问题分析

  1. 初始化逻辑错误:binder.writeBeanAsDraft(myBean)是将表单数据写入草稿,而非加载初始数据,应改用setBeanAsDraft启用草稿模式后,再用readBean加载初始值。
  2. 保存方法逻辑混乱:binder.readBean(myBean)是将Bean数据同步到表单,不是“获取更新后的Bean”,正确操作是用writeBean将草稿内容写入原Bean,之后直接使用原Bean即可。
  3. 撤销方法冗余:无需手动设置单个字段值,readBean(myBean)会自动同步所有绑定字段的初始状态。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 19:05:00