使用VetoableChangeListener停止循环的通知

时间:2020-03-06 14:35:23  来源:igfitidea点击:

我对VetoableChangeListener的设计有疑问。我实现了VetoableChangeListener接口来侦听模型类中属性的更改,因此在模型触发时

vetoableChange(PropertyChangeEvent evt) throws PropertyVetoException

我尝试将更改保存在数据库中,这可能会失败(例如,通过" SQLException")。如果失败,则抛出PropertyVetoException以恢复模型中的更改。

该模型委派给" VetoableChangeSupport"(JDK类),该模型在接收到" PropertyVetoException"时将其捕获并通知将其恢复为" VetoableChangeListener",并与" oldValue" /" newValue"互换(稍后将其重新抛出例外),以便该事件再次出现在我的班级上,并且我尝试再次保存在DB中,依此类推...

我有一个解决方法,就是在没有人抛出PropertyVetoException之前,模型不会更改,因此我在VetoableChangeListener中首先检查要保存在数据库中的数据是否不等于模型,如果相等,我将忽略更改。

还有其他更好的解决方法吗?

解决方案

我们应该在更改模型之前而不是之后检查Vetoable更改...

即:如果有问题,则不会更改模型,如果更改错误,则不要还原模型

收件人:富人

那正是我所做的事情,我收到事件,尝试更新数据库,但失败了,我抛出了否决该变更的异常,因此该模型未更新,但是问题是VetoableChangeSupport通知了我自己的否决权,如果不执行我在问题中解释的解决方法,请进入泡罩

"解决方法"并不是真正的解决方法,但实际上对我来说听起来像是正确的解决方案:在尝试"更改"持久化版本之前,请确认实际上对象的当前状态有所更改。这也将更加有效(数据库访问非常昂贵)。