2012-08-24 9 views
14

Próbuję ręcznie dodać indywidualny komunikat o błędzie e-mail do mojego modelu, ale nic nie jest wyświetlane w widoku.
Myślę, że może to być sposób, w jaki jestem tworzenie lub dołączony ObjectError do BindingResult.
Dodaję błąd wewnątrz catch.Dodawanie komunikatu o błędzie do Spring 3 DataBinder dla pól obiektów niestandardowych

Oto treść result.errors gdy zostawiam pole email pusty i JSR-303 adnotacje kopać (wyświetla błąd w widoku):

[Field error in object 'user' on field 'email': rejected value []; codes [NotEmpty.user.email,NotEmpty.email,NotEmpty.java.lang.String,NotEmpty]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [user.email,email]; arguments []; default message [email]]; default message [may not be empty]] 



Oto treść wyniku. błędy po I ręcznie dodać ErrorObject (error-mail nie wyświetla się w widoku):

[Error in object 'email': codes []; arguments []; default message [An account already exists for this email.]] 



Kontroler:

@RequestMapping(value = "/registration", method = RequestMethod.POST) 
    public ModelAndView post(@Valid User user, BindingResult result) 
    { 

     if (result.hasErrors()) 
     { 
      ModelAndView modelAndView = new ModelAndView(
        Consts.MODEL_RESISTER_PAGE); 
      modelAndView.addObject("user", user); 
      return modelAndView; 
     } 
     else 
     { 
      try 
      { 
       userService.addUser(user); 

       ModelAndView modelAndView = new ModelAndView(
         Consts.MODEL_CARD_REPORTS_HOME_PAGE); 
       modelAndView.addObject("userRegisteredSuccess", Boolean.TRUE); 

       return modelAndView; 
      } 
      catch (DataIntegrityViolationException ex) 
      { 
       ObjectError error = new ObjectError("email","An account already exists for this email."); 

       result.addError(error); 

       ModelAndView modelAndView = new ModelAndView(
         Consts.MODEL_RESISTER_PAGE); 

       modelAndView.addAllObjects(result.getModel()); 
       modelAndView.addObject("user", user); 

       return modelAndView; 
      } 
     } 
    } 

Moja Model:

@Entity 
public class User implements Serializable 
{ 
    /** 
    * 
    */ 
    private static final long serialVersionUID = -5232533507244034448L; 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 

    @NotEmpty 
    @Size(min=2, max=15) 
    private String firstname; 

    @NotEmpty 
    @Size(min=2, max=15) 
    private String surname; 

    @NotEmpty 
    @Email 
    private String email; 

    @NotEmpty 
    @Size(min=6, max=10) 
    private String password; 

    public Long getId() 
    { 
     return id; 
    } 

    public void setId(Long id) 
    { 
     this.id = id; 
    } 

    public String getFirstname() 
    { 
     return firstname; 
    } 

    public void setFirstname(String firstname) 
    { 
     this.firstname = firstname; 
    } 

    public String getSurname() 
    { 
     return surname; 
    } 

    public void setSurname(String surname) 
    { 
     this.surname = surname; 
    } 

    public String getEmail() 
    { 
     return email; 
    } 

    public void setEmail(String email) 
    { 
     this.email = email; 
    } 

    public String getPassword() 
    { 
     return password; 
    } 

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



add.html

<form id="registrationForm" action="#" 
     th:action="@{/registration}" th:object="${user}" method="post" 
     class="clearfix"> 

     <legend>Registration</legend> 

     <div class="control-group input" 
      th:class="${#fields.hasErrors('firstname')}? 'control-group input error'"> 
      <input type="text" th:field="*{firstname}" 
      placeholder="Firstname" /> <span class="help-block" 
      th:if="${#fields.hasErrors('firstname')}" 
      th:errors="*{firstname}"></span> 
     </div> 

     <div class="control-group input" 
      th:class="${#fields.hasErrors('surname')}? 'control-group input error'"> 
      <input type="text" th:field="*{surname}" placeholder="Surname" /> 
      <span class="help-block" 
      th:if="${#fields.hasErrors('surname')}" 
      th:errors="*{surname}"></span> 
     </div> 

     <div class="control-group input" 
      th:class="${#fields.hasErrors('email')}? 'control-group input error'"> 
      <input type="text" th:field="*{email}" placeholder="Email" /> 
      <span class="help-block" th:if="${#fields.hasErrors('email')}" 
      th:errors="*{email}"></span> 
     </div> 

     <div class="control-group input" 
      th:class="${#fields.hasErrors('password')}? 'control-group input error'"> 
      <input type="password" th:field="*{password}" 
      placeholder="Password" /> <span class="help-block" 
      th:if="${#fields.hasErrors('password')}" 
      th:errors="*{password}"></span> 
     </div> 

     <div class="clearfix"> 
      <input type="submit" class="btn btn-success btn-large" 
      value="Register" /> 
     </div> 

     </form> 

Odpowiedz

46

ja zwykle nazywają result.rejectValue("property", "error.object"); dodać błędy BindingResult. Jeśli chcesz dodać błąd obiektu globalnego, możesz użyć result.reject("error.object");.

Więc w kodzie, zamiast:

ObjectError error = new ObjectError("email","An account already exists for this email."); 
result.addError(error); 

spróbuj:

result.rejectValue("email", "error.user", "An account already exists for this email."); 

Sprawdź odniesienie here.

Mam nadzieję, że to pomoże.

+0

Doskonały - nie wiedziałem o metodzie rejectValue. To rozwiązało galaretki problemowe. Dzięki –

+0

Podobnie jak umieszczamy ** zlokalizowaną wiadomość ** w 'rejectValue', możemy umieścić ** zlokalizowaną wiadomość ** tj." Error.user "w' ObjectError'? Nie mogę uzyskać zlokalizowanej wiadomości, jeśli używam 'ObjectError'. Otrzymuję zlokalizowaną wiadomość za pomocą 'rejectValue'. Czy możesz pomóc? –

+0

Dlaczego używasz 'ObjectError'? Powinieneś użyć metody 'rejectValue' zamiast instancji' ObjectError', aby dodać błędy do kontrolera. W ten sposób otrzymasz zlokalizowane wiadomości. – jelies

Powiązane problemy