Contrôleur spring mvc: comment rester sur la page de validation de formulaire erreur se produit

J'ai à côté code de travail dans mon spring mvc contrôleur:

@RequestMapping(value = "/register", method = RequestMethod.GET)
public void registerForm(Model model) {
    model.addAttribute("registerInfo", new UserRegistrationForm());
}

@RequestMapping(value = "/reg", method = RequestMethod.POST)
public String create(
        @Valid @ModelAttribute("registerInfo") UserRegistrationForm userRegistrationForm,
        BindingResult result) {

    if (result.hasErrors()) {
        return "register";
    }
    userService.addUser(userRegistrationForm);
    return "redirect:/";
}

En bref create méthode essayez de valider UserRegistrationForm. Si le formulaire contient des erreurs, il laisse l'utilisateur sur la même page avec le formulaire rempli les champs où le message d'erreur sera affiché.

Maintenant, j'ai besoin d'appliquer le même comportement à une autre page, mais là, j'ai un problème:

@RequestMapping(value = "/buy/{buyId}", method = RequestMethod.GET)
public String buyGet(HttpServletRequest request, Model model, @PathVariable long buyId) {
    model.addAttribute("buyForm", new BuyForm());
    return "/buy";
}

@RequestMapping(value = "/buy/{buyId}", method = RequestMethod.POST)
public String buyPost(@PathVariable long buyId,
                          @Valid @ModelAttribute("buyForm") BuyForm buyForm,
                          BindingResult result) {

    if (result.hasErrors()) {
        return "/buy/" + buyId;
    }

    buyForm.setId(buyId);
    buyService.buy(buyForm);
    return "redirect:/show/" + buyId;
}

J'ai fait face avec la question de la dynamique de l'url. Maintenant, si le formulaire a des erreurs, je dois préciser que le même modèle de page pour rester sur la page en cours, mais aussi je dois passer buyId comme une variable de chemin d'accès. Où sont les conflits dans ces deux exigences. Si je laisse ce code tel qu'il est, je reçois un message d'erreur (je suis en utilisant Thymeleaf comme un modèle de processeur):

Error resolving template "/buy/3", template might not exist or might not be accessible by any of the configured Template Resolvers

Je peux écrire quelque chose comme return "redirect:/buy/" + buyId, mais dans ce cas je perds toutes les données et les erreurs de la forme de l'objet.

Que dois-je faire pour les mettre en œuvre dans buyPost méthode le même comportement que dans create méthode?

Jetez un oeil à stackoverflow.com/questions/18039064/..., vous pouvez utiliser FlashAttributes pour transmettre les données à la redirection de vue.
Cette solution est meilleure que rediriger simplement, parce que les valeurs des champs du formulaire sont enregistrées. Mais dans ce cas, je lâche mon BindingResult pour ce formulaire, donc je ne peux pas encore montrer les erreurs de validation à l'utilisateur après la soumettre le formulaire.
Vous pouvez passer BindingResult avec d'autres données, voir stackoverflow.com/questions/2543797/...
Merci, maintenant ça fonctionne. Auparavant, j'ai essayé de passer BindingResult objet à l'aide de FlashAttributes, mais je ne peux pas le faire dans mon buyGet méthode par @ModelAttribute parce que BindingResult ne contient pas de constructeur par défaut et ne peut pas être instanciée. J'ai donc passé cet objet grâce à la session, ce qui semble un peu difficile.
Hippoom, vous pourriez format de vos commentaires, comme réponse, et je vais l'accepter comme un correct.

OriginalL'auteur Maxim Kolesnikov | 2013-08-08