使用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通知了我自己的否决权,如果不执行我在问题中解释的解决方法,请进入泡罩
"解决方法"并不是真正的解决方法,但实际上对我来说听起来像是正确的解决方案:在尝试"更改"持久化版本之前,请确认实际上对象的当前状态有所更改。这也将更加有效(数据库访问非常昂贵)。