2010-11-26 14 views
0

J'ai beaucoup essayé d'implémenter une validation à l'intérieur d'un MultiActionController et il semble que ce ne soit pas évident. Je dois valider un formulaire et, en cas d'échec, je souhaite rediriger vers le même formulaire, affichant les erreurs et pouvant aussi charger des informations à partir d'une base de données. J'ai donc essentiellement ceci:Comment lier des erreurs de validation à une requête en utilisant MultiActionController?

@RequestMapping("/addResponse.htm") 
public ModelAndView addResponse(@ModelAttribute("responseDTO") ResponseDTO 
      respDTO, BindingResult result, HttpServletRequest request) { 

ResponseFormValidator respValidator = new ResponseFormValidator(); 
respValidator.validate(respDTO, result); 

if (result.hasErrors()) { 
    return new ModelAndView("redirect:responseForm.htm?id=" + respDTO.getProjID()); 
} 
} 

Ce que je veux est la méthode de gestionnaire de responseForm de se rappeler les erreurs résultent du processus de validation (l'objet de résultat) Bien sûr, je peux copier et coller la logique de cette méthode à l'intérieur de ma déclaration if, mais je pense que ce doit être une meilleure façon que de copier et coller.

Toute aide sera grandement appréciée!

+0

'MultiActionController' et' @ RequestMapping' s'excluent mutuellement. Lequel est-ce? – skaffman

+0

C'est MultiActionController en utilisant des annotations –

+0

@ariel_ro: Comme je l'ai dit, vous ne pouvez pas utiliser les deux, vous utilisez l'un ou l'autre. – skaffman

Répondre

0

Dans la version Spring antérieure à 3.1.x, si vous souhaitez passer un objet via une redirection, vous devez informer votre contrôleur de la "session". http://static.springsource.org/spring/docs/2.5.x/reference/portlet.html#portlet-controller (partie 16.9, recherchez @SessionAttribute)

Mais après, il est de votre responsabilité de nettoyer l'objet (s) stocké en session que vous ne voulez pas utiliser plus. Avec Spring 3.1.x, le flashAttribute est un mécanisme très utile et Spring fait le travail pour cela.

http://static.springsource.org/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-flash-attributes

un peu de code Ci-dessous pour montrer le principe:

@RequestMapping(value = "form", method = RequestMethod.GET) 
public String showForm(@ModelAttribute("form") FormBean formBean) { 

    // Set some properties if needed 

    return "tiles-litools-mml"; 
} 

@RequestMapping(value = "form", method = RequestMethod.POST) 
public String formAction(@Validated({MyValidator.class}) 
    @ModelAttribute("form") FormBean formBean, 
    BindingResult validatorresult, Model model, Errors errors, 
    RedirectAttributes redirectAttributes) { 

    //redirect if any error 
    if (validatorresult.hasErrors()){ 

     redirectAttributes.addFlashAttribute("message", "MML session failed"); 
     redirectAttributes.addFlashAttribute("form", formBean); 
     redirectAttributes.addFlashAttribute("validation", validatorresult); 
     return "redirect:/app/tools/form"; // redirect to the form GET method 

    } 

    // TODO continue code for process the form (valid!) 


} 

Je suppose que vous ne Prolonge pas MultiActionController.

+0

Ai-je besoin de définir le formulaireBean si je n'utilise pas de redirection? Je suis actuellement en train de tourner la session pour tous mes JSP, et il semble que je ne peux pas obtenir les erreurs à afficher en retournant à la page de formulaire. Il me montre la trace d'exception à la place. – bertie