Spring MVC中Validation參數校驗踩坑總結


1. maven依賴配置不全導致@NotNull、@NotBlank、@NotEmpty不生效

解決方法:在web層引入以下依賴:

  • validation-api.jar (contains the abstract API and the annotation scanner)
  • hibernate-validator.jar (contains the concrete implementation)
  • slf4j-api.jar (just to get its logger to work as well)
<dependency>
    <groupId>javax.validation</groupId>
    <artifactId>validation-api</artifactId>
    <version>2.0.1.Final</version>
</dependency>
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>6.1.2.Final</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>2.0.0-alpha1</version>
</dependency>

我在編寫的時候就是少了第三個依賴,導致LocalDate類型的參數可以被@NotNull檢驗,而String類型的參數均不能被這三者檢驗。直到上Stack Overflow才解決這個問題。

2. 沒有開啟@Valid注解導致@NotNull、@NotBlank、@NotEmpty不生效

解決方法:在控制器參數中開啟@Valid注解,並用BindingResult接收錯誤信息:

@RequestMapping("/add")
public String add(@Valid Reservation RESERVATION, BindingResult result, ...) {
    if (result.hasErrors()) {
	Map<String, String> err = new HashMap<String, String>();
	List<FieldError> list = result.getFieldErrors();
	FieldError error = null;
	for (int i = 0; i < list.size(); i++) {
		error = list.get(i);
		err.put(error.getField(), error.getDefaultMessage());
	}
	//仍在request中,jsp頁面可以直接獲取。
	request.setAttribute("errfields", err);
    }
    ...
}

3. 參數中BindingResult沒有緊跟在開啟驗證的實體類后面書寫導致400錯誤

錯誤范例:

@RequestMapping("/add")
public String add(@Valid Reservation RESERVATION,..., BindingResult result, ...) {
}

注意:實體類和BindingResult類這兩個參數中間不能有其他參數,否則會產生400 Bad Request錯誤。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM