2012-06-22 29 views
0

我遇到了一個問題,我正在發送POST到Grails 1.3.7以及查詢字符串上的format=json參數。Grails withFormat執行

基於Grails withFormat文檔 - http://grails.org/doc/1.3.7/ref/Controllers/withFormat.html,這個參數應該會導致withFormat閉包執行閉包內的json

即:

withFormat { 
    json { 
     // this logic should be executed if the query string has format=json 
    } 
} 

在這種情況下,控制器方法服務於多個內容類型。有一些邏輯應該只爲形式運行,所以加入一個withFormat關閉,像這樣:

withFormat { 
    form { 
     // form specific logic 
    } 
} 

注意沒有json塊,因爲沒有相應的邏輯來執行,如果這是一個JSON請求。問題是即使在我們發送查詢字符串上的format=json的請求上,表單塊也正在執行。

爲什麼會發生這種情況?

回答

4

顯然,如果你沒有在withFormat中指定匹配的閉包,Grails仍然會運行一個。 Grails文檔注意到,如果請求格式是「全部」,它將執行withFormat塊中的第一個閉包。我猜想,如果你的請求格式與withFormat塊中的某個閉包不匹配,Grails默認運行第一個閉包。

爲了解決這個問題,我們在withFormat中放置了一個空的json閉包,Grails按照預期處理了一切。

withFormat { 
    json { 
     // do nothing 
    } 
    form { 
     // form specific logic 
    } 
}