Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/grails/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Grails 如何使用元类和invokeMethod实现委托?_Grails_Groovy - Fatal编程技术网

Grails 如何使用元类和invokeMethod实现委托?

Grails 如何使用元类和invokeMethod实现委托?,grails,groovy,Grails,Groovy,我正在尝试创建一个有点灵活的标签解决方案。我以前曾想过这样解决它:。但是,由于这似乎没有任何成果,所以我不会朝着另一个方向前进 我现在要做的是检测一个域类是否有对标记的引用。如果是,那么我尝试将方法委托分配给taggableService 下面的所有代码都试图找到指定的方法并在当前对象上调用它。但是,如果找不到它,则尝试在委托对象上调用它。如果全部失败,则抛出MissingMethodException for(GrailsClass c in grailsApplication.getDoma

我正在尝试创建一个有点灵活的标签解决方案。我以前曾想过这样解决它:。但是,由于这似乎没有任何成果,所以我不会朝着另一个方向前进

我现在要做的是检测一个域类是否有
标记的
引用。如果是,那么我尝试将方法委托分配给
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中迷路了,有人能帮我吗?

结果是测试框架没有正确处理引导。如果我在控制器类中测试它。它工作得很好…:(

你看过可标记插件了吗?是的,我看过,但我决定创建自己的插件,因为我不喜欢插件设计的每个方面。结果证明,只是测试框架没有正确处理引导。如果我改为在控制器类中测试它,它工作得很好…:(作为另一个提示,对于其他尝试这样做的人,您可以使用methodMissing/missingMethod(不要记住它是哪一个)而不是invokeMethod,因此如果该方法缺失,您只需将其传递给委托。更不用说代码了。。。