SpringformsModelAttribute字段validation,以避免400 Bad Request Error

我有一个ArticleFormModel包含由普通html form发送的数据,由Spring使用@ModelAttribute注释注入,即

 @RequestMapping(value="edit", method=RequestMethod.POST) public ModelAndView acceptEdit(@ModelAttribute ArticleFormModel model, HttpServletRequest request, BindingResult errors) { //irrelevant stuff } 

在某些方面,一切都很完美。 问题是ArticleFormModel包含一个double字段( protected ,使用普通的setter设置)。 只要用户发送的数据是数字,一切正常。 当他们输入一个单词时,我得到的就是400 Bad Request Http Error

我已经为这个控制器注册了一个WebDataBinder

 @InitBinder protected void initBinder(WebDataBinder binder) throws ServletException { binder.setValidator(validator); } 

其中validator是实现org.springframework.validation.Validator接口的自定义类的实例,但我不知道接下来该做什么。 我希望能够解析模型,获得有效的HTTP响应并在表单中显示错误消息。 调用initBinder()方法,我可以从中调用validator.validate() ,但它不会更改错误(对于错误的数据)。

我知道我可以使用setter来解析字符串,检查它是否为数字,如果没有,将该信息存储在变量中,然后在validation期间检索该变量,但这似乎太多了。 必须有一种更简单的方法来强制字段上的类型而不会出现错误。 此外,问题是数据绑定,而不是validation,所以我觉得它应该放在相应的代码层。

我也在考虑实现java.beans.PropertyEditor并调用binder.registerCustomEditor() ,但我缺乏可靠的知识源。

客户端validation(通过JavaScript检查数据是否为数字)是不可能的。

TL; DR:

如何在不获取400 Bad Request Http Error情况下强制某个字段为@ModelAttribute项的特定类型?

您可以使用来发生绑定错误。

它看起来像这样:

控制器:

 @RequestMapping(value="edit", method=RequestMethod.POST) public ModelAndView acceptEdit(@ModelAttribute ArticleFormModel model, BindingResult errors, HttpServletRequest request) { if (errors.hasErrors()) { // error handling code goes here. } ... } 

在模型之后需要将errors参数放在右侧。

有关详细信息,请参见下文(示例17.1):

http://static.springsource.org/spring/docs/3.2.x/spring-framework-reference/html/mvc.html#mvc-ann-methods

JSP:

  ...   

消息属性文件:

 typeMismatch.articleFormModel.price=customized error message