400使用Spring MVC验证模型属性时的错误请求

时间:2015-04-26 13:10:36

标签: spring validation spring-mvc

我正在编写一个简单的控制器,接受用户注册请求我要验证模型属性,但收到400个错误请求。 我已经检查了this question here,这几乎是我遇到的问题,但解决方案对我不起作用。

 @RequestMapping(method = RequestMethod.POST, value = "/sign-up", consumes = "application/x-www-form-urlencoded")
    public ModelAndView addUser(ModelMap model,@Valid @ModelAttribute
    UserRegistrationInfo userRegistrationInfo,
                                HttpServletRequest httpRequest,
                                HttpSession httpSession,
                                BindingResult result) { ..... } 

修改

Spring Version:4.0.6.RELEASE

我已经阅读了SpringMVC架构并在DefaultHandlerExceptionResolver类,doResolveException方法设置了一个断点,并发现抛出了一个BindException异常。但是,我不知道为什么BindingResult没有被填充和方法没有调用执行来让我确定我想要的行为?执行结束于返回handleBindException((BindException) ex, request, response, handler);

protected ModelAndView handleBindException(BindException ex, HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException { response.sendError(HttpServletResponse.SC_BAD_REQUEST); return new ModelAndView(); } 

1 个答案:

答案 0 :(得分:13)

正如您正确地指出的那样,由于绑定错误,您收到了错误的请求。您需要的所有信息实际上都包含在BindingResult对象中,但为了正确使用它,您应该将BindingResult设置为立即关注ModelAttribute,例如

 @RequestMapping(method = RequestMethod.POST, value = "/sign-up", consumes = "application/x-www-form-urlencoded")
    public ModelAndView addUser(ModelMap model,@Valid @ModelAttribute
    UserRegistrationInfo userRegistrationInfo, BindingResult result
                                HttpServletRequest httpRequest,
                                HttpSession httpSession,
                                ) { ..... }

虽然参数的排序通常并不重要,但BindingResult参数是一个例外,因为该方法可以包含多个ModelAttribute参数,每个参数都有自己的专用BindingResult实例。在这种情况下,通过使BindingResult参数紧跟其适用的ModelAttribute来建立关联。

当您重新排序参数时,您将不再收到400错误,而是请求将进入控制器,日志将显示确切的绑定问题,或者只是检查是否result.hasErrors()和通过调用result.getAllErrors()来迭代字段错误。然后它应该足够简单,以解决您的绑定问题和随之而来的错误请求。

检查文档http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-ann-methods

的部分