我正在编写一个简单的控制器,接受用户注册请求我要验证模型属性,但收到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(); }
答案 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
的部分