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

