【发布时间】:2011-08-21 04:57:55
【问题描述】:
我正在尝试创建一个有点灵活的标记解决方案。我以前曾想过这样解决它:Polymorphic belongsTo in many to many mapping in grails?。但由于这似乎没有任何结果,所以我没有朝另一个方向前进。
我现在要做的是检测域类是否具有对Tag 类的hasMany 引用。如果是这样,那么我尝试将方法委托分配给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 中迷路了,谁能帮帮我?
【问题讨论】:
-
你看过可标记插件grails.org/plugin/taggable
-
是的,我有,但我决定创建自己的,因为我不喜欢插件设计的各个方面。
-
原来只是测试框架没有正确处理引导程序。如果我改为在控制器类中测试它。它工作得很好...... :(
-
作为另一个提示,给其他尝试这样做的人。您可以使用methodMissing/missingMethod(不记得它是一个)而不是invokeMethod,因此如果缺少该方法,您只需将其传递给委托。更少的代码...