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=[]]]]

したがって、1レベルだけ深くなり、2番目のアイテムが含まれているアイテムに置き換えられているように見えます。

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 に答える