我正在尝试使用Config.groovy中的构建器语法来绘制网站的导航结构,如下所示:
com.foo.demo.siteStructure = NodeBuilder.newInstance().site() {
item(controller: 'sample', action: 'list')
item(controller: 'address', action: 'list') {
item(controller: 'city', action: 'list', title: 'Municipality')
}
}
在调试器中生成的对象是:
site[attributes={}; value=[item[attributes={controller=sample, action=list}; value=[]], item[attributes={controller=city, action=list, title=Municipality}; value=[]]]]
所以它似乎只是深入一级,并用它包含的那个替换第二个项目。
如果我预先定义一个Item对象并使用ObjectGraphBuilder
,我会获得相同的单一级别的嵌套:
class Item {
String controller
String action
String title
SiteNode parent
List<Item> items = []
}
因此,看起来ConfigSlurper会以某种方式破坏结果。有没有更好的方法将嵌套结构标记为配置值?
答案 0 :(得分:3)
我确实通过调整资源插件读取配置的方式来实现这一点。我首先将配置的值更改为常规闭包:
com.foo.demo.siteStructure = {
root {
item(controller: 'sample', action: 'list')
item(controller: 'address', action: 'list') {
item(controller: 'city', action: 'list', title: 'Municipality')
}
}
}
然后在单例中进行了dsl的实际处理(类似这样):
Node root
def menus = grailsApplication.config.com.foo.demo.siteStructure
if (menus instanceof Closure) {
def builder = new NodeBuilder()
menus.delegate = builder
menus.resolveStrategy = Closure.DELEGATE_FIRST
root = menus()
}