介绍
1. @valid注解
说明:@valid 注解用于校验,所属的包为:javax.validation.Valid
使用:可以在自定义的实体类的属性上添加校验的规则。具体规则点我
2. BindingResult
说明:验证的错误返回
使用:@valid和BindingResult是配对出现,并且形参顺序是固定的。如果使用了多个@valid,那么每个@valid后面跟着的BindingResult就是这个@valid的验证结果。
bindingResult.hasErrors()判断是否有校验没有通过的,使用bindingResult.getAllErrors()可以获取全部的ObjectError,objectError.getDefaultMessage()可以获取设置在实体类属性上的注解的message,如果没设置,会默认返回javax.validation.constraints.XXXX.message。
常用API:
boolean hasErrors(); 如果有任何错误返回true。
boolean hasFieldErrors(); 是否有任何字段错误,如果有返回true。
int getErrorCount(); 返回错误总数。
List<ObjectError> getAllErrors(); 获取所有错误,包括全局错误和现场错误。
List<FieldError> getFieldErrors(); 获取与字段相关的所有错误。
boolean hasFieldErrors(String field); 是否存在与给定字段相关的任何错误,如果有返回true。
List<FieldError> getFieldErrors(String field); 获取与给定字段相关的所有错误。
使用场景
在开发的过程中如果需要对某些实体类的属性进行校验的时候,可以用@valid+BindingResult替换if。
代码
实体类
package com.halon;
import lombok.Data;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.NotEmpty;
import javax.validation.constraints.Min;
import javax.validation.constraints.Size;
import java.util.List;
/**
* @Author halon
* @create 2021/9
*/
@Data
public class Person{
@NotEmpty(message = "学生的姓名不能为empty")
@Length(max = 5,message = "名字的长度不能超过5")
private String name;
@Min(value = 18,message = "18以下不能看哦~")
private Integer age;
@Size(min = 1,max = 3,message = "只能有1-3个朋友一起观看!")
private List<String> friends;
}
controller
package com.halon;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.Valid;
import java.util.Arrays;
/**
* @Author halon
* @create 2021/9
*/
@RestController
@RequestMapping("/test")
public class MyTestController {
private final Logger LOGGER = LoggerFactory.getLogger(MyTestController.class);
@GetMapping("/validAndBindingResultDemo")
public void validAndBindingResultDemo(@Valid @RequestBody Person person, BindingResult bindingResult) {
validParams(bindingResult);
System.out.println(person);
}
/**
* 检验输入参数
*
* @param result result
*/
private void validParams(BindingResult... result) {
Arrays.stream(result)
//过滤掉没有任何错误的BindingResult
.filter(BindingResult::hasErrors)
//得到每个List<ObjectError>
.map(BindingResult::getAllErrors)
//从ObjectError中得到message信息
.forEach(objectErrorList -> {
objectErrorList.stream().forEach(objectError -> {
//日志输出message
LOGGER.error(objectError.getDefaultMessage());
});
});
}
}
请求:
{
"name": "halon123",
"age": 17,
"friends":[1,2,3,4,5]
}
控制台输出:
20210909 17:47:28.643 [http-nio-11385-exec-2] [ERROR] com.halon.MyTestController.lambda$null$0(MyTestController.java:46) - 18以下不能看哦~
20210909 17:47:28.644 [http-nio-11385-exec-2] [ERROR] com.halon.MyTestController.lambda$null$0(MyTestController.java:46) - 名字的长度不能超过5
20210909 17:47:28.644 [http-nio-11385-exec-2] [ERROR] com.halon.MyTestController.lambda$null$0(MyTestController.java:46) - 只能有1-3个朋友一起观看!
Person(name=halon123, age=17, friends=[1, 2, 3, 4, 5])