grails - 如何使用 metaClass 和 invokeMethod 实现委托(delegate)?

标签 grails groovy

我试图创建一个有点灵活的标记解决方案。我之前想过这样解决:Polymorphic belongsTo in many to many mapping in grails? .但由于这似乎没有任何结果,所以我没有朝另一个方向前进。

我现在要做的是检测域类是否具有 hasMany引用 Tag类(class)。如果是这样,那么我尝试将方法委托(delegate)分配给 taggableService .

以下代码试图做的就是找到指定的方法并在当前对象上调用它。但是,如果它没有找到它,则尝试在委托(delegate)对象上调用它。如果全部失败,则抛出 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中迷路了,有人可以帮助我吗?

最佳答案

原来只是测试框架没有正确处理 Bootstrap 。如果我改为在 Controller 类中测试它。它工作得很好...... :(

关于grails - 如何使用 metaClass 和 invokeMethod 实现委托(delegate)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5929072/

相关文章:

json - 尝试将域类序列化为JSON时发生Grails堆栈溢出错误

rest - Grails Restful Controller 未从帖子上的 rest 模板接收数据(保存)

java - 有没有更好的方法来添加多个模拟交互?

java - 是否可以在 Groovy 中使用不是脚本的委托(delegate)

grails - 在Groovy Controller /服务中使用非默认dataSource

unit-testing - mockForConstraintsTests抽象的Groovy类

grails - Grails forward()导致StackOverflow错误

hibernate - 获取具有特定权限的人员-带有Grails的 Spring 安全

groovy - Gradle ,过载扩展设定器

grails - 使用Java类作为Grails命令