5

私はこれらのような通常のグルーヴィーなクロージャーに精通しています

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が渡されている場合、ペイロードはどこにありますか?

誰かがこのスニペットを詳しく説明してもらえますか?

4

2 に答える 2

4

上記の実装でwithEndpointRequestは、2 つのパラメーターを取るクロージャーです。

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")
            }
        }
    }

ここで注意すべき点の 1 つClosure payloadは、 が最後のパラメーターであるということです。

ここで、 SpringWS プラグイン内の質問に記載されているように、クロージャー ( payload) が呼び出されるまで呼び出されないことに注意してください。payload.call()

Closures as Method Argumentsを見てください。

あなたが理解したいことを伝えることができたと思います。:)

于 2013-06-12T19:51:58.237 に答える