如何在Config.groovy中使用Grails中的NodeBuilder分配嵌套结构?

时间:2012-08-21 16:31:37

标签: grails builder

我正在尝试使用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会以某种方式破坏结果。有没有更好的方法将嵌套结构标记为配置值?

1 个答案:

答案 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()
}