2

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

4

1 回答 1

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()
}
于 2012-08-23T20:09:54.257 回答