![](/img/trans.png)
[英]Spring MVC @ModelAttribute returns “Bad Request” error 400
[英]Spring form ModelAttribute field validation to avoid 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來解析字符串,檢查它是否為數字,如果沒有,將該信息存儲在變量中,然后在驗證期間檢索該變量,但這似乎太多了。 必須有一種更簡單的方法來強制字段上的類型而不會出現錯誤。 此外,問題在於數據綁定,而不是驗證,所以我覺得它應該放在相應的代碼層中。
我也在考慮實現java.beans.PropertyEditor
並調用binder.registerCustomEditor()
,但我缺乏可靠的知識源。
客戶端驗證(通過JavaScript檢查數據是否為數字)是不可能的。
TL; DR:
如何在不獲取400 Bad Request Http Error
情況下強制某個字段為@ModelAttribute
項的特定類型?
您可以使用<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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.