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

Vaadin Binder疑问:何时会实际写入底层Bean?

Vaadin Binder 更新Bean时机及恢复问题解答

你的原有认知确实有误,Vaadin Binder默认不会等到调用writeBean()才更新底层Bean。

为什么Bean会自动被修改?

默认配置下,Binder会在组件值变更(比如用户输入完成后离开输入框)时,自动将组件值同步到底层Bean中。这个行为由BeanUpdateMode.ALWAYS(默认模式)控制,无需手动调用writeBean()。

为什么readBean()无法恢复原有值?

当你调用readBean()时,它是从当前已被修改的Bean中读取值回显到表单,而非最初的原始状态,所以自然无法恢复到修改前的值。

解决方法

方法一:禁用自动同步,手动控制Bean更新

通过设置BeanUpdateMode.NONE,让Binder仅在调用writeBean()时才更新Bean:

binder.setBeanUpdateMode(BeanUpdateMode.NONE);

之后只有主动调用binder.writeBean(bean),才会将表单组件的最新值同步到Bean中。此时点击恢复按钮调用readBean(),就能从原始Bean中读取值回显表单。

方法二:备份原始Bean状态

如果需要保留自动同步的便利性,可以在表单初始化时深拷贝一份原始Bean的备份。当用户点击恢复按钮时,将备份的Bean重新绑定到Binder:

// 初始化时创建原始Bean的深拷贝备份
YourBean originalBackup = deepCopy(yourOriginalBean);

// 恢复按钮点击逻辑
restoreButton.addClickListener(e -> {
    // 从备份读取值回显表单
    binder.readBean(originalBackup);
    // 若需要更新当前绑定的Bean,重新设置备份的拷贝
    binder.setBean(deepCopy(originalBackup));
});

注意:深拷贝需确保Bean的所有字段(包括引用类型)都被正确复制,避免备份与原始Bean共享引用导致备份也被修改。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 12:10:35