2010-12-08 7 views
7

Pourquoi le ressort ne lie-t-il pas les valeurs de mon objet imbriqué?Objet imbriqué de liaison Spring MVC

L'objet SecurityQuestion sur RegistrationBean est défini avec des questions et réponses comme null, null, respectivement, malgré la définition dans le formulaire en utilisant la notation de bean dans la vue.

haricots:

public class SecurityQuestion { 
    SecurityQuestionType type; 
    String answer; 
} 

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


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

Vue:

<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> 

Controller:

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

Solution

Tous les haricots doivent avoir des getters/setters pour tous les champs. Spring utilise le constructeur par défaut, puis utilise les setters pour faire muter l'objet de la vue.

+0

L'attribut de question est manquant dans SecurityQuestion (je suppose que c'est parce que vous avez oublié de l'écrire dans la question). Avez-vous des getters et setters pour les attributs? – Javi

Répondre

7

Pouvez-vous essayer de donner à la RegistrationBean un getter/setter approprié.

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