加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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.

我希望我能够传达你想要理解的东西.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读