Hibernate 如何从groovy反射(?)中获取域类值?
我想在一些插件上显示doWithDynamicMethod调用的persistentProperties值 通过下面的代码,我成功地截获了域类上的save和update方法,并在它们试图保存对象时查看它们的输出 但是我无法打印persistentProperties的内容(可能是因为我是groovy和grails的noob,因此我不熟悉groovy反射的语法) 有人能帮忙吗 以下是我的代码:Hibernate 如何从groovy反射(?)中获取域类值?,hibernate,grails,reflection,groovy,Hibernate,Grails,Reflection,Groovy,我想在一些插件上显示doWithDynamicMethod调用的persistentProperties值 通过下面的代码,我成功地截获了域类上的save和update方法,并在它们试图保存对象时查看它们的输出 但是我无法打印persistentProperties的内容(可能是因为我是groovy和grails的noob,因此我不熟悉groovy反射的语法) 有人能帮忙吗 以下是我的代码: def doWithDynamicMethods = { ctx -> // TODO Im
def doWithDynamicMethods = { ctx ->
// TODO Implement registering dynamic methods to classes (optional)
application.domainClasses.each { gc ->
def domainClass = gc.clazz
domainClass.metaClass.invokeMethod = { name, args ->
if (name == 'save' || name == 'update')
delegate.log.info " ${delegate.class.name}.$name() args: $args"
new DefaultGrailsDomainClass(delegate.class).persistentProperties.each{ property ->
delegate.log.info "printing properties => "+ property.name+ " "
}//end persistentProperties.each
}//endmetaClass.invokeMethod
} //end domainClasses.each
}//end doWithDynamicMethod
如果我了解您试图执行的操作,您的代码当前正在列出与域类本身关联的
persistentProperties
。要实际获取属性值,您需要传递属性名
例如,如果您具有以下域类:
class Book {
String title
String lang
}
如果您正在保存一本新的书籍
,如下所示:
def b = new Book(title: 'Hemingway', lang: 'en-us').save()
您的代码应该打印出如下内容:
printing properties => title
printing properties => lang
printing properties => Hemingway
printing properties => en-us
如果您希望它打印如下内容:
printing properties => title
printing properties => lang
printing properties => Hemingway
printing properties => en-us
然后,您必须从obj本身访问该属性:
def doWithDynamicMethods = { ctx ->
application.domainClasses.each { gc ->
def domainClass = gc.clazz
domainClass.metaClass.invokeMethod = { name, args ->
def domainObj = delegate
if (name == 'save' || name == 'update') {
new DefaultGrailsDomainClass(domainObj.class).persistentProperties.toList().each { property ->
domainObj.log.info "printing properties => " + domainObj[property.name]
}
}
def called = domainClass.metaClass.getMetaMethod(name, args)
called?.invoke(domainObj, args)
}
}
}
还有一些其他问题。变量delegate
对于每个闭包都是特殊的。如果您实际运行它,您可能没有看到“打印属性…”根本不需要记录消息,因为在调用delegate.log.info
的内部,每个closuredelegate
都引用封闭类的闭包。另外,如果要从domainObj
读取属性,则应确保它位于name if子句内部,否则将调用i再次使用nvokeMethod
最后,您应该获取最初被调用的元方法并调用它,否则它实际上不会保存/更新。Phoung,感谢您的帮助,我将代码更改为:delegate.log.info“printing properties=>”+property.name+“”+delegate[property.name]
,它可以工作!