Grails — как выполнять код перед каждым сохранением?

Есть ли хороший/стандартный способ выполнить некоторый общий код перед каждым вызовом save() в классах предметной области?

Например, мой домен

class Page {

    String url
    Boolean processed
    Date date
    Integer urlCrc 
}

Моя форма имеет только 3 первых поля, и я хотел бы вычислять urlCrc каждый раз, когда вызывается метод save(). Я не могу просто переопределить метод сохранения, потому что он вводится.


person mrok    schedule 03.06.2012    source источник


Ответы (3)


Вы можете использовать события GORM — см. документацию. Поскольку по умолчанию validate() вызывается перед каждым save(), я бы использовал это.

class Page {
    //your defs here

    def beforeValidate() {
        this.urlCrc = yourComputationHere
    }
}
person Kelly    schedule 03.06.2012
comment
Спасибо, это работает. К сожалению, grails.org не работает из-за проблем с маршрутизацией grails.1312388.n4.nabble.com/ поэтому мне нужно спросить здесь - person mrok; 04.06.2012
comment
Приведенное выше решение, вероятно, является лучшим, но другой вариант — использовать вычисляемое поле Grails. См. документы для этого. - person sf_jeff; 10.07.2014
comment
Если вы хотите выполнить код перед сохранением, используйте beforeUpdate() / beforeInsert(). если вы используете beforeValidate(), он вызывается всегда, когда вы вызываете validate() (метод save() вызывает 'validate()' перед сохранением). Таким образом, ваш код выполняется до проверки, даже если вы не сохраняете. - person IgniteCoders; 03.11.2014

Эта тема рассматривается в документах GORM:

6.5 Расширенные возможности GORM

6.5.1 События и автоматическая отметка времени

person fergal_dd    schedule 23.03.2015

person    schedule
comment
можно ссылку на документацию по этому поводу? - person dopatraman; 21.09.2016
comment
Да, это документация - person IgniteCoders; 22.09.2016