Общий метод beforeUpdate для домена Grails - PullRequest
0 голосов
/ 05 марта 2020

Я пытаюсь использовать общий метод beforeUpdate, написав в BootStrap.groovy.

def init = { servletContext ->
         for (domainClass in grailsApplication.domainClasses) {
            if(domainClass.clazz.simpleName == domainName){
                domainClass.metaClass.beforeUpdate = {
                    println  "i am here "
                    def dirtyPropertyNames = this.getDirtyPropertyNames()
                    println(dirtyPropertyNames)
                    if(dirtyPropertyNames != null && dirtyPropertyNames.size() > 0) {

                        for (dirtyPropertyName in dirtyPropertyNames) {
                            def oldValue = (this.getPersistentValue((dirtyPropertyName)))
                            def newValue = (this."${dirtyPropertyName}")
                        }
                    }
                }
            }
        }
    }

Но я не могу использовать this.getdirtyPropertyNames(), поскольку он выдает ошибку.

groovy .lang.MissingMethodException: Нет подписи метода:

Если он находится в самом домене, this.getDirtyPropertyNames() работает нормально. Я тоже пытался использовать domainClass.getDirtyPropertyNames(), но все равно выдает ошибку.

Я использую Grails 4.

1 Ответ

1 голос
/ 05 марта 2020

Я не уверен, что вы спрашиваете, как выполнить sh, что вы хотите, или почему вы получаете ошибку, которую получаете.

Если вы хотите знать, как выполнить sh, что Вы хотите, я бы использовал слушатель событий вместо метапрограммирования метода. Существует множество примеров: https://github.com/jeffbrown/gorm-events-demo/blob/261f25652e5fead8563ed83f7903e52dfb37fb40/src/main/groovy/gorm/events/demo/listener/AuditListener.groovy#L22 -L26 - это один.

Если вы спрашиваете, почему вы получаете ошибку, которую вы получаете, причина в том, что this ссылается на экземпляр BootStrap, а не экземпляр класса вашего домена. Если вы действительно хотите использовать динамический метапрограммирующий подход c (не следует), то вы можете решить эту конкретную часть проблемы, ссылаясь на delegate вместо this.

Я надеюсь, что помогает.

...