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)

    javax.validation
    validation-api
    2.0.1.Final


    org.hibernate
    hibernate-validator
    6.1.2.Final


    org.slf4j
    slf4j-api
    2.0.0-alpha1

我在编写的时候就是少了第三个依赖,导致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 err = new HashMap();
	List 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错误。