Spring 3.0 MVC绑定嵌套对象

问题描述:

为什么spring没有绑定我的嵌套对象上的值?Spring 3.0 MVC绑定嵌套对象

RegistrationBean上的SecurityQuestion对象的问题和答案分别设置为null,null,尽管在窗体中使用视图中的bean表示法进行设置。

豆类:

public class SecurityQuestion { 
    SecurityQuestionType type; 
    String answer; 
} 

public class RegistrationBean { 
    @Valid 
    SecurityQuestion securityQuestion; 
    String name; 


    public SecurityQuestionType[] getSecurityQuestionOptions() { 
    return SecurityQuestionType.values(); 
    } 
} 

查看:

<form:form modelAttribute="registrationBean" method="POST"> 
    <form:select id="securityQuestion" path="securityQuestion.question"> 
    <c:forEach var="securityQuestionOption" items="${securityQuestionOptions}"> 
     <form:option value="${securityQuestionOption}">${securityQuestionOption</form:option> 
    </c:forEach> 
    </form:select> 

    <form:input id="securityAnswer" path="securityQuestion.answer" /> 
    <form:input id="name" path="name" /> 
</form:form> 

控制器:

@RequestMapping(value = URL_PATTERN, method = RequestMethod.POST) 
public ModelAndView submit(@Valid final RegistrationBean registrationBean) { 
    // registrationBean.getSecurityQuestion().getQuestion() == null 
    // registrationBean.getSecurityQuestion().getAnswer() == null 
} 

解决方案

所有的bean必须有getter/setter的所有字段。 Spring使用默认的构造函数,然后使用setter从视图中改变对象。

+0

问题属性在SecurityQuestion中丢失(我想这是因为你忘记了写在问题中)。你有属性的getter和setter吗? – Javi 2010-12-08 19:36:20

你可以尝试给RegistrationBean一个合适的getter/setter。

public class RegistrationBean { 
    @Valid 
    SecurityQuestion securityQuestion; 
    String name; 

    public SecurityQuestion getSecurityQuestion(){ 
     return securityQuestion; 
    } 
    public void setSecurityQuestion(SecurityQuestion q){ 
     this.securityQuestion = q; 
    }  
    public SecurityQuestionType[] getSecurityQuestionOptions() { 
    return SecurityQuestionType.values(); 
    } 
}