2010-11-26 22 views
0

我试了很多在MultiActionController里面实现一个验证,它似乎不是一帆风顺的。 我需要验证一个表单,如果失败,我想重定向到相同的表单,显示错误,并且能够从数据库加载一些信息。 所以基本上我有这样的:如何使用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()); 
} 
} 

我想是的responseForm处理方法记住错误验证过程中得到的(结果对象) 当然,我可以复制和粘贴的逻辑方法在我的if语句中,但我认为它必须是一种比复制和粘贴更好的方法。

任何帮助将不胜感激!

+0

`MultiActionController`和`@ RequestMapping`是互斥的。这是什么? – skaffman 2010-11-26 10:18:07

+0

它是使用注释的MultiActionController – 2010-11-26 10:26:22

回答

0

在3.1.x之前的Spring版本中,如果要通过重定向传递对象,则必须使控制器“会话”知道。 http://static.springsource.org/spring/docs/2.5.x/reference/portlet.html#portlet-controller (部分16.9,寻找@SessionAttribute)

之后却是你的责任,清理存储在您不想再使用的会话对象(或多个)。

在Spring 3.1.x中,flashAttribute是一个非常有用的机制,Spring为此做好了准备。

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

下文一些代码来显示原理:

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


} 

我以为你不伸出的MultiActionController。