我试图通过用beforeUpdate编写BootStrap.groovy来使用一种常见的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。
发布于 2020-03-05 03:49:37
我不知道你是否在问如何完成你想要的,或者你为什么要得到你要得到的错误。
如果您想知道如何完成所需的任务,我将使用事件侦听器而不是元编程方法。有很多例子,https://github.com/jeffbrown/gorm-events-demo/blob/261f25652e5fead8563ed83f7903e52dfb37fb40/src/main/groovy/gorm/events/demo/listener/AuditListener.groovy#L22-L26就是其中之一。
如果您在问为什么要获得所获得的错误,原因是this引用了BootStrap实例,而不是域类的实例。如果您真的想使用动态元编程方法(您不应该),那么您可以通过引用delegate而不是this来解决问题的这个特定部分。
我希望这能帮上忙。
https://stackoverflow.com/questions/60537450
复制相似问题