Остановка зацикленных уведомлений с помощью VetoableChangeListener - PullRequest
1 голос
/ 23 сентября 2008

У меня проблема с дизайном VetoableChangeListener. Я реализую интерфейс VetoableChangeListener для прослушивания изменений свойства в классе модели, поэтому при срабатывании модели

vetoableChange(PropertyChangeEvent evt) throws PropertyVetoException

… Я пытаюсь сохранить изменения в БД, которые могут потерпеть неудачу (например, SQLException). Если это не удается, я выбрасываю PropertyVetoException, чтобы отменить изменения в модели.

Модель делегирует в VetoableChangeSupport (класс JDK), который, когда получает PropertyVetoException, ловит ее и уведомляет о возврате ко ВСЕМ VetoableChangeListener, с oldValue / newValue взаимозаменяемыми (позже он сбрасывает исключение), так что событие снова приходит в мой класс, и я снова пытаюсь сохранить в БД и т. д ...

У меня есть обходной путь, который заключается в том, что модель НЕ меняется, пока никто не выбросит PropertyVetoException, так что в VetoableChangeListener Я ПЕРВЫЙ проверю, не совпадают ли данные, которые я собираюсь сохранить в базе данных, с данные в модели, если они равны, я просто игнорирую изменение.

Есть ли другой, лучший обходной путь?

Ответы [ 3 ]

1 голос
/ 26 октября 2008

Ваш «обходной путь» на самом деле не обходной путь, но на самом деле он звучит как правильное решение для меня: подтверждение того, что на самом деле происходит изменение текущего состояния объекта до попытки «изменить» сохраненную версию. Это также будет намного более эффективным (доступ к базе данных стоит дорого).

0 голосов
/ 23 сентября 2008

Кому: timyates

Это именно то, что я делаю, я получаю событие, пытаюсь обновить БД, и оно терпит неудачу, я выкидываю исключение, налагающее вето на изменение, так что модель не обновляется, но проблема в том, что VetoableChangeSupport уведомляет меня о моем собственное вето, если я не сделаю обходной путь, который я объясняю в вопросе

0 голосов
/ 23 сентября 2008

Вы должны проверить изменение Vetoable до изменения модели, а не после ...

т.е.: если есть проблема, модель не изменяется, не возвращать модель, если изменение было неправильным

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...