Параметр @ModelAttribute не заполняется - PullRequest
2 голосов
/ 05 ноября 2010

У меня есть контроллер, в котором у меня есть метод GET, отображающий форму POJO, которая должна быть захвачена соответствующим POST. Однако при выполнении запроса POST форма POJO создается, но никогда не заполняется, и ошибки не отображаются (кроме ошибок проверки пустых значений).

Я использую Spring 3.0.

@Controller
public class UserController {
 @RequestMapping(value = "/register", method = RequestMethod.GET)
 public ModelAndView renderRegisterForm(
   @ModelAttribute("registerForm") UserRegisterForm registerForm) {

  ModelAndView mav = new ModelAndView("user.register");
  mav.addObject("registerForm", registerForm);

  return mav;
 }

 @RequestMapping(value = "/register", method = RequestMethod.POST)
 public ModelAndView registerForm(
   HttpServletRequest request,
   @Valid @ModelAttribute("registerForm") UserRegisterForm registerForm,
   BindingResult results) {

  // All fields in registerForm are null, results has errors for the @NotNull annotations

  return new ModelAndView("user.register");
 }
}

На мой взгляд, все очень просто, для создания формы используются пружинные формы:

<form:form cssClass="registerForm" modelAttribute="registerForm" method="post" action="/register">

  <div class="inputContainer">
   <form:label path="name">
   <spring:message code="user.edit.name"/>
   </form:label>
   <form:input path="name"/>
   <form:errors path="name" cssClass="error"></form:errors>
  </div>

  <div class="inputContainer">
   <form:label path="email">
   <spring:message code="user.edit.email"/>
   </form:label>
   <form:input path="email"/>
   <form:errors path="email" cssClass="error"></form:errors>
  </div>

  <div class="inputContainer">
   <form:label path="password">
   <spring:message code="user.edit.password"/>
   </form:label>
   <form:password path="password"/>
   <form:errors path="password" cssClass="error"></form:errors>
  </div>

  <div class="inputContainer">
   <form:label path="repeatPassword">
   <spring:message code="user.edit.repeatPassword"/>
   </form:label>
   <form:password path="repeatPassword"/>
   <form:errors path="repeatPassword" cssClass="error"></form:errors>
  </div>

  <div class="submit-button">
         <input  type="submit" value="<spring:message code="register"/>"/>
        </div>  
</form:form>

и сама форма ...

@FieldMatchList({@FieldMatch(first="password", second="repeatPassword")})
public class UserRegisterForm {

 @NotNull
 @Size(min = 1, max = 50)
 private String name;

 @NotNull
 @Email
 @Size(max=100)
 private String email;

 @NotNull
 @Size(min=6, max=32)
 private String password;

 @NotNull
 @Size(min=6, max=32)
 private String repeatPassword;

 // Getters and setters...
}

Заранее спасибо!

1 Ответ

1 голос
/ 05 ноября 2010

Ну, я только что начал возиться с Spring, но у меня этот сценарий работает, так что, думаю, я могу рассказать вам, что я сделал по-другому. Комментарии встроены в код ниже

<code>@Controller
public class UserController {
 @RequestMapping(value = "/register", method = RequestMethod.GET)
 public ModelAndView renderRegisterForm() {
  // Do not use the method parameters, instead instantiate a new binding object yourself
  UserRegistrationForm registerForm = new UserRegistrationForm();</p>

<p>ModelAndView mav = new ModelAndView("user.register");
  // Use mav.getModel().put() instead
  mav.getModel().put("registerForm", registerForm);
  return mav;
 }</p>

<p>@RequestMapping(value = "/register", method = RequestMethod.POST)
  public ModelAndView registerForm(
    HttpServletRequest request,
    // I didn't need to annotate my bound object with @ModelAttribute when using @Valid
    @Valid UserRegisterForm registerForm,
    BindingResult results) {
    // All fields in registerForm are null, results has errors 
    // for the @NotNull annotations
    return new ModelAndView("user.register");
  }
}

У меня также есть небольшое различие в использовании тега формы на мой взгляд

form: form cssClass = "registerForm" commandName = "registerForm"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...