2012-08-24 8 views
14

Sto tentando di aggiungere manualmente un messaggio di errore individuale al mio modello, ma nella vista non viene visualizzato nulla.
Penso che potrebbe essere come sto creando o allegato ObjectError a BindingResult.
Sto aggiungendo l'errore all'interno del fermo.Aggiunta di un messaggio di errore a Spring 3 DataBinder per campi oggetto personalizzati

Ecco il contenuto di result.errors quando lascio campo email vuoto e JSR-303 annotazioni calci a (segnalazioni di errore in vista):

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



Ecco il contenuto di di risultato. errori dopo che ho aggiungere manualmente l'ErrorObject (errore di e-mail non viene visualizzata nella visualizzazione):

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



controller:

@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; 
      } 
     } 
    } 

il mio modello:

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

risposta

46

Io di solito chiamo result.rejectValue("property", "error.object"); aggiungere errori al BindingResult. Se si desidera aggiungere un errore di oggetto globale, è possibile utilizzare result.reject("error.object");.

Così, nel codice, invece di:

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

provare con:

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

Controllare il riferimento here.

Spero che questo aiuti.

+0

Eccellente: non ero a conoscenza del metodo rejectValue. Questo ha risolto il problema con le gelatine. Grazie –

+0

Come abbiamo messo ** messaggio localizzato ** in 'rejectValue', possiamo mettere ** messaggio localizzato ** i.e." error.user "in' ObjectError'? Non riesco ad ottenere un messaggio localizzato se utilizzo 'ObjectError'. Sto ricevendo un messaggio localizzato usando 'rejectValue'. Puoi per favore aiutare ?? –

+0

Perché stai usando 'ObjectError'? Dovresti usare il metodo 'rejectValue' invece dell'istanza' ObjectError' per aggiungere errori al tuo controller. In questo modo otterrai i messaggi localizzati. – jelies

Problemi correlati