Groovy Closure说明
发布时间:2020-12-14 16:28:25 所属栏目:大数据 来源:网络整理
导读:我很熟悉像这样的正常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
我很熟悉像这样的正常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) 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(String serviceUrl,Closure payload). 当您从客户端使用withEndpointRequest时,您实际上正在这样做 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声明闭包内容,上面的内容更加流畅. 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") } } } 这里要注意的一点是Closure有效载荷是最后一个参数. 现在,请注意在调用payload.call()之前不会调用闭包(有效负载),如SpringWS插件中的问题所述. 看看Closures as Method Arguments. 我希望我能够传达你想要理解的东西. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |