2013-06-12 39 views
5

Tôi quen với việc đóng cửa groovy bình thường như thế nàyGroovy Đóng giải thích

def printSum = {a,b -> 
    println a+b 
} 

printSum(5,7) // 12 

Tuy nhiên, tôi đã xem qua mã từ SpringWS plugin mà tôi có một thời gian hiểu biết cứng:

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

Tôi hiểu rằng ở trên là một đóng cửa.

Nó đang được sử dụng như thế này:

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

nếu serviceURL đã được thông qua năm sau đó ở đâu là tải trọng?

Ai đó có thể giải thích đoạn trích này một cách chi tiết không?

+0

Dường như tải trọng được tiêm bởi các plugin với một số loại phương pháp đánh chặn. – moskiteau

+0

Dường như các công cụ trong niềng răng là trọng tải ('HolidayRequest'). Có lẽ Groovy có một số đường cú pháp cho phép bạn chỉ định các đối số hàm theo cách đó?Hãy thử kiểm tra nó bằng cách gọi 'printSum (5) {7}' hoặc một cái gì đó tương tự như vậy. – rliu

Trả lời

4

Trong quá trình thực hiện ở trên, withEndpointRequest là một đóng bao gồm hai tham số.

withEndpointRequest(String serviceUrl, Closure payload).

Khi bạn đang sử dụng withEndpointRequest từ khách hàng của bạn, bạn đang thực sự làm

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) 

Trên đây đã được thực hiện groovier bằng cách tuyên bố nội tuyến đóng cửa với withEndpointRequest. Ở trên cũng có thể được viết là

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

ít chi tiết hơn. Cuối cùng, nó có thể được sắp xếp hợp lý và có nhiều rãnh hơn bằng cách viết như

def response = withEndpointRequest(serviceURL) { 
     HolidayRequest(xmlns: namespace) { 
      Holiday { 
       StartDate("2006-07-03") 
       EndDate("2006-07-07") 
      } 
      Employee { 
       Number("42") 
       FirstName("Russ") 
       LastName("Miles") 
      } 
     } 
    } 

Một điểm cần lưu ý ở đây là tham số cuối cùng.

Bây giờ, lưu ý rằng việc đóng (payload) không được gọi cho đến khi payload.call() được gọi như được đề cập trong câu hỏi của bạn bên trong plugin SpringWS.

Hãy xem Closures as Method Arguments.

Tôi hy vọng tôi có thể truyền đạt những gì bạn muốn hiểu. :)

0

Snipet sau, được đăng here, cung cấp tổng quan về một số tùy chọn được sử dụng để chuyển một đóng cửa thành phương thức.

Phương pháp có hai đối số. Đối số cuối cùng là một đóng cửa.

def work(input, cl) { 
    cl(input) 
} 

Xác định đóng.

def assertJava = { 
    it == 'Java' 
} 

cách để vượt qua việc đóng cửa với phương pháp

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' 
// }