簡體   English   中英

Spring形式ModelAttribute字段驗證,以避免400 Bad Request Error

[英]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):

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

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM