鉴于这种严重简化的引渡安排:
package net.myexample.plugin
class MyExampleService {
Map doMunge(Map m) {
// do stuff to m
return m
}
}
/****************************** BREAK: NEXT FILE ******************************/
package net.myexample.plugin
class MyTagLib {
static namespace = p
def myExampleService
def tag = { attrs, body ->
def m = doMungeAndFilter(attrs.remove( m ))
out << g.render(template: /template , plugin: my-example-plugin , model: m)
}
Map doMungeAndFilter(def m) {
def mm = myExampleService.doMunge(m)
// do stuff to m
return mm
}
}
/****************************** BREAK: NEXT FILE ******************************/
package net.myexample.app
import net.myexample.plugin.MyExampleService
class MyExampleService extends net.myexample.plugin.MyExampleService {
def doMunge(def m) {
def mm = super.doMunge(m)
// do more stuff to mm
return mm
}
}
/****************************** BREAK: NEXT FILE ******************************/
package net.myexample.app
import net.myexample.plugin.MyTagLib
class MyTagLib extends net.myexample.plugin.MyTagLib {
static namespace = a
def myExampleService
def tag = { attrs, body ->
def m = doMungeAndFilter(attrs.remove( m ))
out << g.render(template: /template , plugin: my-example-plugin , model: m)
}
Map doMungeAndFilter(def m) {
def mm = super.doMungeAndFilter(m)
// do more stuff to mm
return mm
}
}
/**
* But we get an exception that cites that it cannot call doMunge on a null
* object -- which could only be myExampleService
*/
为什么这个服务看起来是 null
? 当 app s taglib 上的方法调用其超级类(插件上的标签lib ), 而该方法又调用该服务上的方法时, 为什么这个服务看起来是 null
?
我所能想到的最佳理论是,这项服务实际上并没有在应用程序标签类中被即时使用,因为除了def
之外,没有明确提及它。我想,情况就是这样,因为如果我把所有服务类方法的逻辑都移到标签类方法中,它就会如预期的那样发挥作用。
(为绘制完整图片: MyExample service.doMunge
被调用到其他地方,而随后的过滤(在 MyTagLib.doMunge和Filter
中)只对标签lib 需要。 )
另选 : 如果我将 doMungeANDFilter
移动到另一个服务类别, 在插件中创建基版本并在应用程序中扩展它, 效果会很好。 我想这是一个可以接受的结论, 尽管它感觉像浮肿一样, 创建另一个服务类别来支持标签lib 。
思考 提示 错误或疏漏