2014-05-09 110 views
0

在我的Grails 2.3.8的應用程序,我已經定義了以下控制器動作Grails命令對象初始化

class RegisterController { 

    def register(User user) { 
     render text: "User name is '$user.name'" 
    } 
} 

user參數是一個域類的實例。如果我使用該URL調用此控制器,請使用以下URL:

http://localhost:8080/myapp/register/register 

我收到NullPointerException。然而我的數據綁定的理解是,如果這個動作是不帶任何參數調用,參數應該被指定爲new User()

+2

沒有。如果url中沒有有效的'id',則用戶域將爲空。 – dmahapatro

+0

@dmahapatro你確定嗎?如果這是真的,看起來你永遠不能使用一個動作參數來保存一個新的域類實例 –

+0

@dmahapatro我不知道這是真的。如果僅傳遞與目標對象中的任何字段匹配的單個表單參數,則會發生數據綁定。 – rmlan

回答

5

然而,我對數據綁定的理解是,如果這個動作是 沒有任何參數的調用,應該爲該參數分配一個新的 User()

這不一定是這種情況。對於域類命令對象(如果不存在任何參數),僅爲POST請求創建新實例。

http://grails.org/doc/2.4.0.RC1/guide/theWebLayer.html#commandObjects ...

如果命令對象的類型是一個域類和沒有ID 請求參數然後空將被傳遞到控制器動作 除非HTTP請求方法是「POST 「,在這種情況下,將通過調用域類 構造函數創建域類的新實例 。

該文本可能從2.3.8文檔中丟失。我會驗證並在必要時添加它。

+0

我已經驗證註釋已經更新爲2.3.x(https:///github.com/grails/grails-doc/commit/b019c1184cc8e8ed9638118f4f66a58527a1ea1c)。該網站將進行更新,以反映該文件下次發佈時的澄清情況,這可能會在下週左右公佈2.3.9。 –

+1

請注意,由於https://jira.grails.org/browse/GRAILS-11247已得到解決,此行爲在2.3.8中進行了更改。 –

+0

GRAILS-11247背後的推理對我來說並不明顯,即*爲什麼*是爲命令是非域類時爲POST請求創建的新對象,而不是當命令*爲*域類時創建的新對象? –

-2

如果修改內容:

'$user.name' 

爲:

'${user?.name}' 
+0

然後,我顯然不會得到NPE,但這不是我的問題的重點 –