如何使用MultiActionController将验证错误绑定到请求?

时间:2010-11-26 09:16:39

标签: java forms spring spring-mvc annotations

我已经尝试了很多在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语句中复制并粘贴该方法的逻辑,但我认为它必须比复制和粘贴更好。

任何帮助都将受到高度赞赏!

1 个答案:

答案 0 :(得分: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。