Groovy闭包解释
我熟悉像这样的常规groovy闭包Groovy闭包解释,groovy,Groovy,我熟悉像这样的常规groovy闭包 def printSum = {a,b -> println a+b } printSum(5,7) // 12 然而,我遇到了来自SpringWS插件的代码,我很难理解: def withEndpointRequest = { url, payload -> def writer = new StringWriter() def request = new MarkupBuilder(writer) payloa
def printSum = {a,b ->
println a+b
}
printSum(5,7) // 12
然而,我遇到了来自SpringWS插件的代码,我很难理解:
def withEndpointRequest = { url, payload ->
def writer = new StringWriter()
def request = new MarkupBuilder(writer)
payload.delegate = request
payload.call()
def webServiceTemplate = new WebServiceTemplate()
def response = webServiceTemplate.sendToEndpoint(url, writer.toString())
new XmlSlurper().parseText(response)
}
我知道以上是一个结束
它是这样使用的:
def namespace = "http://www.myveryimportantcompany.com/hr/schemas"
def serviceURL = "http://localhost:8080/myapp/services"
def response = withEndpointRequest(serviceURL) {
HolidayRequest(xmlns: namespace) {
Holiday {
StartDate("2006-07-03")
EndDate("2006-07-07")
}
Employee {
Number("42")
FirstName("Russ")
LastName("Miles")
}
}
}
如果正在传入serviceURL
,那么有效负载在哪里
有人能详细解释一下这个代码段吗?在上面的实现中,
withEndpointRequest
是一个包含两个参数的闭包
withEndpointRequest(字符串serviceUrl,闭包负载)
当您从客户端使用with endpointrequest
时,您实际上是在
def namespace = "http://www.myveryimportantcompany.com/hr/schemas"
def serviceURL = "http://localhost:8080/myapp/services"
def payload = {
HolidayRequest(xmlns: namespace) {
Holiday {
StartDate("2006-07-03")
EndDate("2006-07-07")
}
Employee {
Number("42")
FirstName("Russ")
LastName("Miles")
}
}
}
def response = withEndpointRequest(serviceURL, payload)
通过使用withEndpointRequest
内联声明闭包,上述操作变得更加groovier。
上述内容也可以写成
def response = withEndpointRequest(serviceURL, {
//payload goes here as an inline closure as the second parameter
HolidayRequest(xmlns: namespace) {
Holiday {
StartDate("2006-07-03")
EndDate("2006-07-07")
}
Employee {
Number("42")
FirstName("Russ")
LastName("Miles")
}
}
})
这就不那么冗长了。最后,通过编写如下代码,它可以被简化并变得更为常规
def response = withEndpointRequest(serviceURL) {
HolidayRequest(xmlns: namespace) {
Holiday {
StartDate("2006-07-03")
EndDate("2006-07-07")
}
Employee {
Number("42")
FirstName("Russ")
LastName("Miles")
}
}
}
这里需要注意的一点是,关闭负载
是最后一个参数
现在,请注意,闭包(payload
)在调用payload.call()
之前不会被调用,正如您在SpringWS插件中的问题中提到的那样
看一看
我希望我能表达你想要理解的内容。:) 下面发布的snipet概述了用于将闭包传递到方法中的几个选项 具有两个参数的方法。最后一个参数是闭包
def work(input, cl) {
cl(input)
}
def assertJava = {
it == 'Java'
}
定义一个闭包
def work(input, cl) {
cl(input)
}
def assertJava = {
it == 'Java'
}
将闭包传递给方法的方法
work('Java', assertJava)
work 'Java', assertJava // No parenthesis.
work('Groovy', {
assert it == 'Groovy'
}) // Anonymous closure as argument.
work('Groovy') {
assert it == 'Groovy'
} // Last argument is closure and can be outside parenthesis.
work('Groovy')
{
assert it == 'Groovy'
} // Opening bracket on new line. If we want a code block (e.g. static initializer) instead of closure we must use ; to separate code.
work 'Groovy', {
assert it == 'Groovy'
} // Pay attention, no parenthesis, so comma is needed again!
// Does not work:
//
// Comma between argument list needed:
// work 'Groovy' {
// assert it == 'Groovy'
// }
看起来负载是由插件用某种方法截取注入的。括号中的东西就是负载(HolidayRequest)。也许Groovy有一些语法糖,可以让您以这种方式指定函数参数?试着通过调用
printSum(5){7}
或类似的方法来测试它。