Если я понимаю, что вы пытаетесь сделать, ваш код в настоящее время перечисляет persistentProperties
, которые связаны с самим классом домена. Чтобы получить значение свойства, вам нужно передать имя свойства.
Например, если у вас есть следующий класс домена:
class Book {
String title
String lang
}
Если вы сохраняете новый Book
, например:
def b = new Book(title: 'Hemingway', lang: 'en-us').save()
Ваш код должен распечатать что-то вроде этого:
printing properties => title
printing properties => lang
Если вы хотите напечатать что-то вроде этого:
printing properties => Hemingway
printing properties => en-us
Тогда вам нужно будет получить доступ к свойству из самого объекта:
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
внутри each
closure delegate
ссылается на класс, включающий замыкание. Также, если вы собираетесь читать свойства из domainObj
, вам следует убедиться, что оно находится внутри имени if, иначе вы снова вызовете invokeMethod
.
Наконец, вы должны получить metaMethod, который первоначально вызывался, и вызвать его, иначе он не будет фактически сохранен / обновлен.