grails - 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。
解决方案
我不确定你是否在问如何完成你想要的,或者你为什么会得到你得到的错误。
如果你想知道如何完成你想要的,我会使用事件监听器而不是元编程方法。有很多例子,https: //github.com/jeffbrown/gorm-events-demo/blob/261f25652e5fead8563ed83f7903e52dfb37fb40/src/main/groovy/gorm/events/demo/listener/AuditListener.groovy#L22-L26一。
如果您问为什么会收到错误,原因是this
引用了 的实例BootStrap
,而不是域类的实例。如果您真的想使用动态元编程方法(您不应该),那么您可以通过引用delegate
而不是this
.
我希望这会有所帮助。
推荐阅读
- javascript - appendchild 后无法将表格行与标题对齐
- ios - iOS中具有多个表格视图的屏幕的容器视图?
- npm - 如何在 Visual Studio Code 中获取 Live Server 的外部 URL?
- php - 使用 PHP 按键和值取消设置数组
- c# - C# 打印 PDF 和移动文件失败。文件正被另一个进程使用
- reactjs - 如何在既不是子元素也不是父元素的两个组件上使用 ref
- java - 在 java eclipse 中,我从数据库中检索数据并粘贴到已经存在的 excel 中。已经存在的数据将被删除
- c++ - C++ 从文件中读取 fstream 数据不会返回正确的值。inputFile.tellg 返回 -1
- javascript - 如何在 JavaScript 中连接两个结构相同的 JSON 数据集?
- pine-script - 谁能检查一下为什么我没有收到信号并收到“未声明的标识符”错误