web-dev-qa-db-fra.com

Ajout d'un message d'erreur à Spring 3 DataBinder pour les champs d'objet personnalisés

J'essaie d'ajouter manuellement un message d'erreur électronique individuel à mon modèle, mais rien ne s'affiche dans la vue.
Je pense que c'est peut-être la façon dont je crée ou attache l'ObjectError au BindingResult.
J'ajoute l'erreur à l'intérieur du crochet.

Voici le contenu de result.errors lorsque je laisse le champ e-mail vide et que les annotations JSR-303 se déclenchent (une erreur s'affiche à l'écran):

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


Voici le contenu de result.errors après avoir ajouté manuellement l'objet ErrorObject (l'erreur de courrier électronique ne s'affiche pas dans la vue):

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


Manette:

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

Mon modele:

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



Fichier 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>
19
Thomas Buckley

J'appelle généralement result.rejectValue("property", "error.object"); pour ajouter des erreurs à BindingResult. Si vous souhaitez ajouter une erreur d'objet global, vous pouvez utiliser result.reject("error.object");.

Donc, dans votre code, au lieu de:

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

essayez avec:

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

Vérifiez la référence ici .

J'espère que cela t'aides.

58
jelies