Как реализовать делегирование с metaClass и invokeMethod? - PullRequest
1 голос
/ 08 мая 2011

Я пытаюсь создать решение для тегирования, которое будет немного гибким.Ранее я думал о том, чтобы решить эту проблему следующим образом: Полиморфное принадлежит ли многим многим картографированию в граалях? .Но так как это, похоже, не приносит никаких плодов, я не шел вперед в другом направлении.

Что я сейчас пытаюсь сделать, это определить, есть ли у класса домена ссылка hasMany на Tag учебный класс.Если это так, то я пытаюсь назначить делегирование метода на taggableService.

Все, что пытается сделать следующий код, - это найти указанный метод и вызвать его для текущего объекта.Однако, если он не находит его, попробуйте вызвать его вместо объекта делегата.И если все не удается, выведите исключение MissingMethodException.

for(GrailsClass c in grailsApplication.getDomainClasses()){
    Map hasMany = c.getPropertyValue('hasMany')

    //continue of has a many mapping with Tag class as its endpoint
    if(hasMany && hasMany.containsValue(Tag)){

        //replace invokeMethod with a delegate strategy
        c.clazz.metaClass.invokeMethod = { String name, args ->
            def metaMethod = c.clazz.metaClass.getMetaMethod(name,args)
            if(metaMethod){
                return metaMethod.invoke(delegate,args);
            }

            metaMethod = taggableService.class.metaClass.getMetaMethod(name, args)
            if(metaMethod){
                return metaMethod.invoke(taggableService,args);
            }
            throw new MissingMethodException(name,delegate.class,args)
        }
    }
}

Однако, похоже, это не дает желаемого эффекта.Я немного заблудился в Groovyland, кто-нибудь может мне помочь?

1 Ответ

0 голосов
/ 11 мая 2011

Оказывается, что только тестовый фреймворк неправильно обрабатывал загрузчик. если я проверил это в классе контроллера вместо этого. все работало нормально ... :(

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