2012-05-15 49 views
0

我有一個非常簡單的控制器,1)加載一個窗體(視圖)使用的對象和2)接受通過該窗體提交的對象的更改。控制器( 「PersonController」)是這樣的:@ModelAttribute對象字段沒有返回到控制器

@RequestMapping(value="/accountsettings/{personid}") 
public String loadAccountSettings(@PathVariable("personid") int personid, 
           ModelMap model){ 
    Person person = personService.find(personid); 
    model.addAttribute("person",person); 
    return "account-settings-form"; 
} 

@RequestMapping(value="/saveaccountsettings") 
public String saveSettings(@ModelAttribute("person") Person person){ 
    personService.update(person); 
    return "account-settings-form"; 
} 

「人」 的POJO看起來是這樣的:

public class Person { 

    private id int; 
    private String name; 
    private String username; 
    private String phoneNumber; 

    //getters and setters follow 

} 

我的形式(帳戶設置 - form.jsp)有以下幾點:

<form:form commandName="person" action="/saveaccountsettings"> 
    <form:input path="name" /><br /> 
    <form:input path="username" /><br /> 
    <form:input path="phoneNumber" /><br /> 
    <input type="submit" /> 
</form:form> 

我遇到的問題是,當窗體加載數據(loadAccountSettings),符合市場預期(名稱,用戶名和電話號碼)的所有字段將被填充。但是,當我去處理更新時,即使數據在表單中,並且(在使用Firebug進行檢查時),我也會將該值作爲參數傳回,但電話號碼字段被視爲空。

有誰知道爲什麼控制器會錯過這個字段的(person.phoneNumber)值?

在此先感謝。

-e

+0

你能告訴你的Person類的代碼與它的getter和setter方法? –

+0

我同意@JapanTrivedi,這似乎是phoneNumber的setter問題。還有一件事:根據[this](http://chompingatbits.com/2009/08/25/spring-formtag-commandname-vs-modelattribute/) – Dani

+0

,您可能想要使用「modelAttribute」而不是「commandName」 @Dani是的,你是正確的有一個問題在那裏** commandName **在表單標籤。我沒有明白。 :) eugene請嘗試更改** commandName **到** modelAttribute **在您的表單標記,因爲在您指定爲** @ ModelAttribute ** –

回答

0

我想通了這個問題,我在上面的描述中離開了,忘了我幾個月前添加了控制器的一部分 - 的InitBinder方法。最近添加的電話號碼字段,但不添加到@ InitBinder的陣列allowedFields的:

@InitBinder 
public void initBinder(WebDataBinder binder){ 
    binder.setAllowedFields(new String[]{ 
     "name", "username", "phoneNumber" 
    }); 
} 
相關問題