我有一个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来解析字符串,检查它是否为数字,如果没有,将该信息存储在变量中,然后在验证期间检索该变量,但这似乎太多了。必须有一种更简单的方法来强制字段上的类型而不会出现错误。此外,问题在于数据绑定,而不是验证,所以我觉得它应该放在相应的代码层中。
我还考虑实施java.beans.PropertyEditor
并致电binder.registerCustomEditor()
,但我缺乏可靠的知识来源。
客户端验证(通过JavaScript检查数据是否为数字)是不可能的。
TL; DR:
如何在不@ModelAttribute
的情况下强制某个字段为400 Bad Request Http Error
项的特定类型?
答案 0 :(得分:20)
您可以使用<form:errors>
来解决绑定错误。
看起来像这样:
控制器:
@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):
JSP:
<form:form modelAttribute="articleFormModel" ... >
...
<form:errors path="price" />
</form:form>
消息属性文件:
typeMismatch.articleFormModel.price=customized error message