2012-08-24 9 views
14

Ich versuche manuell eine individuelle E-Mail-Fehlermeldung zu meinem Modell hinzuzufügen, aber nichts wird in der Ansicht angezeigt.
Ich denke, es kann sein, wie ich den ObjectError zum BindingResult erstelle oder anhefte.
Ich füge den Fehler in den Haken.Hinzufügen einer Fehlermeldung zu Spring 3 DataBinder für benutzerdefinierte Objektfelder

Hier ist der Inhalt von result.errors, wenn ich E-Mail-Feld leer und JSR-303 Anmerkungen treten in (Fehleranzeigen in der Ansicht) verlassen:

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



Hier ist der Inhalt des Ergebnisses.

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



Controller::

Fehler, nachdem ich die ErrorObject manuell hinzufügen (E-Mail-Fehler in Ansicht nicht angezeigt)
@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; 
      } 
     } 
    } 

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

Antwort

46

ich result.rejectValue("property", "error.object"); in der Regel rufen Fehler BindingResult hinzuzufügen. Wenn Sie einen globalen Objektfehler hinzufügen möchten, können Sie result.reject("error.object"); verwenden.

in Ihrem Code Also, statt:

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

versuchen mit:

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

Überprüfen Sie die Referenz here.

Hoffe, das hilft.

+0

Hervorragend - mir war die rejectValue-Methode nicht bekannt. Das ist das Problem Gelees behoben. Danke –

+0

Wie wir lokalisierte Nachricht ** in 'rejectValue' setzen, können wir lokalisierte Nachricht ** d. H." Error.user "in' ObjectError' setzen? Ich kann keine lokalisierte Nachricht erhalten, wenn ich 'ObjectError' verwende. Ich erhalte eine lokalisierte Nachricht, indem ich 'rejectValue' verwende. Können Sie bitte helfen?? –

+0

Warum benutzen Sie 'ObjectError'? Sie sollten die Methode 'rejectValue' anstelle der Instanz 'ObjectError' verwenden, um Fehler in Ihren Controller einzufügen. Auf diese Weise erhalten Sie die lokalisierten Nachrichten. – jelies

Verwandte Themen