Groovy 动态生成的闭包

Groovy 动态生成的闭包,groovy,closures,groovyws,Groovy,Closures,Groovyws,动态生成的闭包 我已经用groovy wslite编写了soap请求: def request = { envelopeAttributes('xmlns:art': 'http://url') body { 'art:validate' { item(itemValue) } } } 它工作得很好,但现在我必须将其更改为list,因此最后它将是这样的: de

动态生成的闭包

我已经用groovy wslite编写了soap请求:

def request = {
        envelopeAttributes('xmlns:art': 'http://url')
        body {
            'art:validate' {
                item(itemValue)
            }
        }
    }
它工作得很好,但现在我必须将其更改为list,因此最后它将是这样的:

def request = {
        envelopeAttributes('xmlns:art': 'http://url')
        body {
            'art:validate' {
                item(itemValue)
            item(itemValue2)
            item(itemValue3)
            }
        }
    }
但我知道如何从列表中动态创建此请求。我甚至将其提取到变量:

def items = {
                item(itemValue)
            item(itemValue2)
            item(itemValue3)
}

但我不知道如何在这个结尾中添加新项目。有什么简单的方法吗?

Builder闭包是普通的Groovy代码,所以

def values = [itemValue, itemValue2, itemValue3]
def request = {
    envelopeAttributes('xmlns:art': 'http://url')
    body {
        'art:validate' {
            values.each { item(it) }
        }
    }
}
应该行得通。或者如果你有

def items = {
        item(itemValue)
        item(itemValue2)
        item(itemValue3)
}
那你就可以了

def request = {
    envelopeAttributes('xmlns:art': 'http://url')
    body {
        'art:validate'(items)
    }
}

(将现有的闭包传递给
art:validate
而不是内联定义一个新的闭包)。

Builder闭包是普通的Groovy代码,类似

def values = [itemValue, itemValue2, itemValue3]
def request = {
    envelopeAttributes('xmlns:art': 'http://url')
    body {
        'art:validate' {
            values.each { item(it) }
        }
    }
}
应该行得通。或者如果你有

def items = {
        item(itemValue)
        item(itemValue2)
        item(itemValue3)
}
那你就可以了

def request = {
    envelopeAttributes('xmlns:art': 'http://url')
    body {
        'art:validate'(items)
    }
}

(将现有的闭包传递给
art:validate
而不是内联定义一个新的闭包)。

对于给定的
项目
闭包,这可能会起作用:

def request = {
    envelopeAttributes('xmlns:art': 'http://url')
    body {
        'art:validate' {
            items.delegate = delegate
            items()
        }
    }
}

如果您需要使用给定的
项目
结尾在
艺术:验证

中包含其他内容,这可能会起作用:

def request = {
    envelopeAttributes('xmlns:art': 'http://url')
    body {
        'art:validate' {
            items.delegate = delegate
            items()
        }
    }
}

如果您需要
art:validate

中的其他内容,请将闭包传递给
art:validate
:-)将闭包传递给
art:validate
:-)的漂亮调用