【问题标题】:Stopping looped notifications with VetoableChangeListener使用 VetoableChangeListener 停止循环通知
【发布时间】:2008-09-23 09:42:52
【问题描述】:

我对@9​​87654321@ 的设计有疑问。我实现了VetoableChangeListener 接口来监听模型类中属性的变化,所以当模型触发时

vetoableChange(PropertyChangeEvent evt) throws PropertyVetoException

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

模型在VetoableChangeSupport(JDK 类)中进行委托,当它接收到PropertyVetoException 时,它会捕获它并通知恢复到所有VetoableChangeListener,与oldValue/newValue 互换(稍后它重新抛出异常),以便事件再次出现在我的课堂上,我尝试再次保存在数据库中,等等......

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

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

【问题讨论】:

    标签: java model-view-controller


    【解决方案1】:

    您的“解决方法”并不是真正的解决方法,但实际上对我来说听起来像是正确的解决方案:在尝试“更改”持久版本之前确认对象的当前状态实际上发生了变化。这也将更加有效(数据库访问成本很高)。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        致:提米亚斯

        这正是我所做的,我接收事件,尝试更新数据库,但它失败了,我抛出异常否决更改,因此模型没有更新,但问题是 VetoableChangeSupport 通知我我的拥有否决权,如果我不执行我在问题中解释的解决方法,则进入 bucle

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-06-30
          • 1970-01-01
          • 2017-01-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多