2016-03-20 2 views
4

Я пытаюсь проверить форму входа. После нажатия кнопки входа элемент управления переходит к моему классу контроллера, и с помощью BindingResult я также узнал, что в моем поле есть ошибки, но я не могу показать ошибку на моей странице jsp. Я попытался метод rejectValue, но моя страница jsp выдает исключение, которое свойство не читается. E.t.cОшибка Spring mvc error not comng on jsp

Вот мой класс модели.

public class UserBean 
{ 
    @NotEmpty 
    private String username; 
    @NotEmpty 
    private String password; 

    public String getPassword() 
    { 
    return this.password; 
    } 

    public String getUsername() 
    { 
    return this.username; 
    } 

    public void setUsername(String username) 
    { 
    this.username = username; 
    } 

    public void setPassword(String password) 
    { 
    this.password = password; 
    } 
} 

Вот моя страница JSP.

<form:form method="POST" modelAttribute="login-entity" 
    action="process-login.html"> 
    <table> 
     <tr> 
      <td><form:label path="username">username:</form:label></td> 
      <td><form:input path="username" /></td> 
      <td><form:errors path="username" /></td> 
     </tr> 
     <tr> 
      <td><form:label path="password">password:</form:label></td> 
      <td><form:input path="password" /></td> 
      <td><form:errors path="password" /></td> 
     </tr> 
     <tr> 
      <td colspan="2"><input type="submit" value="Login" /></td> 
     </tr> 
    </table> 
</form:form> 

и вот мой класс контроллера.

@RequestMapping(value = "/process-login", method = RequestMethod.POST) 
    public ModelAndView processLogin(@Valid UserBean loginModel,BindingResult bindingResult, Model model) 
    { 
    if(bindingResult.hasErrors()) 
    { 
     ModelAndView errorView = new ModelAndView("loginpage"); 
     bindingResult.rejectValue("username","invalid username"); 
     bindingResult.rejectValue("password","invalid password"); 
     errorView.addObject("login-entity", bindingResult.getModel()); 
     return errorView; 
    } 
    return new ModelAndView("redirect:/some_other_page","",""); 
    } 

После отладки мой последний объект представления ошибок содержит эту вещь.

ModelAndView: reference to view with name 'loginpage'; model is {login-entity={userBean=UserBean [userId=0, username=, password=], org.springframework.validation.BindingResult.userBean=org.springframework.validation.BeanPropertyBindingResult: 4 errors 
Field error in object 'userBean' on field 'username': rejected value []; codes [NotEmpty.userBean.username,NotEmpty.username,NotEmpty.java.lang.String,NotEmpty]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [userBean.username,username]; arguments []; default message [username]]; default message [may not be empty] 
Field error in object 'userBean' on field 'password': rejected value []; codes [NotEmpty.userBean.password,NotEmpty.password,NotEmpty.java.lang.String,NotEmpty]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [userBean.password,password]; arguments []; default message [password]]; default message [may not be empty] 
Field error in object 'userBean' on field 'username': rejected value []; codes [invalid username.userBean.username,invalid username.username,invalid username.java.lang.String,invalid username]; arguments []; default message [null] 

Может кому-то помочь? Я думаю, что мне не хватает какой-то очень фундаментальной вещи.

ответ

0

Вы можете добавить атрибут к вашему запросу при перенаправлении с вашего контроллера на страницу .jsp и присвоить ему сообщение об ошибке (ServletRequest.setAttribute (String var1, Object var2);) Затем на странице jsp посмотрите для атрибута и обрабатывать сообщение об ошибке соответственно.

0

Вам необходимо добавить аннотацию @ModelAttribute, и вы не должны создавать новую ModelAndView, потому что новая модель не будет иметь результирующие ошибки привязки. После должны работать для вас

public ModelAndView processLogin(@ModelAttribute("login-entity") @Valid UserBean loginModel,BindingResult bindingResult, Model model) 

Таким образом, ошибки будут доступны в модели, и ключ поиска будет соответствовать тому, что ожидается в form:errors теги

О части модели вы должны просто делать что-то как

if(bindingResult.hasErrors()) 
    { 
     return null; // calling page 
    } 

и сообщения будут там

+0

Спасибо за ответ, так что после того, как это делать, как я должен отправить ошибку обратно в JSP. Должен ли я использовать тот же метод BindingResult. –

+0

На самом деле, нет, возможно, еще более важный момент, так как вы используете его, вы уничтожаете свою модель. Отредактированный ответ –

0

Вы можете определить первую модель вашего атрибута, как и что,

@ModelAttribute("UserBean") 
public UserBean userCriteria() { 
    return new UserBean(); 
} 

И от контроллера

public ModelAndView processLogin(@ModelAttribute("UserBean") @Valid UserBean loginModel,BindingResult bindingResult, Model model)