2010-12-08 3 views
7

Почему весна не привязывает значения к моему вложенному объекту?Spring 3.0 MVC связывание вложенного объекта

Объект SecurityQuestion на RegistrationBean задается с вопросом и ответом как null, null, соответственно, несмотря на то, что он задан в форме с использованием бинарной нотации в представлении.

Фасоль:

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 
} 

Решение

Все бобы должны иметь геттеры/сеттеры для всех полей. Spring использует конструктор по умолчанию, а затем использует сеттеры для мутирования объекта из представления.

+0

Вопрос об ошибке отсутствует в SecurityQuestion (я полагаю, это потому, что вы забыли написать его в вопросе). У вас есть геттеры и сеттеры для атрибутов? – Javi 2010-12-08 19:36:20

ответ

7

Можете ли вы попробовать предоставить RegistrationBean подходящий приемник/сеттер.

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