首页 > 解决方案 > Grails 域的常用 beforeUpdate 方法

问题描述

我正在尝试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。

标签: grailsgrails-4

解决方案


我不确定你是否在问如何完成你想要的,或者你为什么会得到你得到的错误。

如果你想知道如何完成你想要的,我会使用事件监听器而不是元编程方法。有很多例子,https: //github.com/jeffbrown/gorm-events-demo/blob/261f25652e5fead8563ed83f7903e52dfb37fb40/src/main/groovy/gorm/events/demo/listener/AuditListener.groovy#L22-L26一。

如果您问为什么会收到错误,原因是this引用了 的实例BootStrap,而不是域类的实例。如果您真的想使用动态元编程方法(您不应该),那么您可以通过引用delegate而不是this.

我希望这会有所帮助。


推荐阅读