Как получить значение класса домена из Groovy отражения (?)? - PullRequest
0 голосов
/ 02 марта 2012

Я хочу показать значение persistentProperties, вызванное doWithDynamicMethod для какого-либо плагина

с помощью следующего кода мне удалось перехватить метод сохранения и обновления в классах домена и посмотреть их вывод при попытке сохранить объект.

Но я не смог напечатать содержимое persistentProperties (возможно, потому что я нуб на groovy и grails, поэтому я не знаком с синтаксисом на groovy отражении.

Кто-нибудь может помочь?

Ниже мой код:

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

1 Ответ

2 голосов
/ 02 марта 2012

Если я понимаю, что вы пытаетесь сделать, ваш код в настоящее время перечисляет 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, который первоначально вызывался, и вызвать его, иначе он не будет фактически сохранен / обновлен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...