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?
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
Vous devez vous connecter pour publier un commentaire.
J'ai essayé la solution de dessus décrite dans ce post ce week-end, mais il ne fonctionne pas pour BindingResult.
Le code ci-dessous fonctionne, mais pas parfait.
BindingResult
paraddFlashAttribute
ressemble commune de la question stackoverflow.com/questions/15903238/... de toute façon travailler autour de a été trouvé, de sorte que la question pourrait être fermé. Merci.Mentionné solution n'a pas fonctionné pour moi jusqu'à ce que j'ai changé de registre "org.springframework.la validation.BindingResult.inscription" pour la modelAttribute nom.
OriginalL'auteur Yugang Zhou
*Je suis en utilisant Hibernate Validator Api pour valider mes haricots. Afin de préserver les données du formulaire avec l'affichage de messages d'erreur, vous devez faire ces 3 choses:
À l'intérieur de contrôleur:
@Contrôleur
public class RegistrationController {
}
Mise à jour de votre point de vue/jsp pour tenir les messages d'erreur:
Ce l'article peut sûrement être utile.
Le lien est cassé 🙁
OriginalL'auteur masT
Vous pouvez modifier votre POST-mise en œuvre:
En option, vous pouvez également annoter la méthode avec
@PostMapping("/buy/{buyId}")
si vous utilisez Printemps 4.3 ou supérieur.OriginalL'auteur Wim Deblauwe