Я не вижу причин, по которым вы не могли бы просто использовать ограничение для этого (как вы предлагали).Нечто подобное должно сделать это
class Order {
String state
static constraints = {
state(validator: {stateValue, self ->
// only check state if this object has already been saved
if (self.id && stateValue == 'invoiced') {
return false
}
})
}
}
Если по какой-то причине вы не можете использовать ограничение, вот пара альтернативных предложений:
Мета-программирование
Используйте возможности перехвата методов Groovy для перехвата вызовов на save()
.Ваш перехватчик должен переадресовать вызов только на перехваченный save()
, если у заказа нет выставленного состояния.
В книге Programming Groovy есть несколько хороших примеров
События GORM
GORM предоставляет ряд событий , которые запускаются в течение жизненного цикла постоянных объектов.В событиях beforeUpdate
или beforeValidate
может быть возможно предотвратить обновление объекта (я думаю, будет сгенерировано исключение)