SpringBoot中使用注解校验实体类参数
1、引入需要的依赖
使用注解校验需要先引入对应的依赖
<!--参数校验注解所需依赖 spring-boot2.3之后需要单独引入-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
<!--这里版本一般和springboot一样-->
<version>${spring-boot.version}</version>
</dependency>
2、常用注解说明
注解 | 作用类型 | 作用说明 |
---|---|---|
@Null | 任意对象类型,不能是基本数据类型 | 字段只能为null |
@NotNull | 任意类型 | 字段不能为null |
@Min | byte/short/int/long/float/double及其对应的包装类;包装类对象不为null时才校验 | 限制必须为一个小于等于指定值的整数 |
@Max | byte/short/int/long/float/double及其对应的包装类;包装类对象不为null时才校验 | 限制必须为一个大于于等于指定值的整数 |
@NotBlank | 字符串 | 内容不为null且不为空字符串 |
@NotEmpty | 字符串、集合、数组 | |
@Range | String(数字类型的字符串),非null时才校验byte/short/int/long/float/double及其包装类,包装类非null时才校验 | 值在指定范围内 |
@Size(min=,max=) | 字符串、集合、数组 | 长度在指定区间内,可以为null |
@Pattern(regexp = “”,message = “”) | 字符串 | 字段需要符合注解中的正则表达式 |
@Length(min=,max=) | 字符串 | 字符串长度需要在指定的区间 |
@Past | Date或者Calendar对象 | 必须是一个过去的日期 |
@PastOrPresent | Date或者Calendar对象 | 必须是一个过去或者当前的日期 |
@Future | Date或者Calendar对象 | 必须是一个将来的日期 |
@FutureOrPresent | Date或者Calendar对象 | 必须是一个将来或者当前的日期 |
3、@Valid与@Validated的区别
3.1、 注解使用的地方
- @Valid:可以用在方法、构造函数、方法参数和成员属性(字段)上
- @Validated:可以用在类型、方法和方法参数上。但是不能用在成员属性(字段)上
3.2、 分组
- @Valid没有分组的功能
- @Validated提供了一个分组功能,可以在入参验证时,根据不同的分组采用不同的验证机制。没有添加分组属性时,默认验证没有分组的验证属性。
实体类参数:
这里需要注意的是如果当前对象引用的有其他对象,如果想引用的对象的校验也生效,需要在引用的对象上加@Valid注解
public class Grade {
private int id;
@NotBlank(message = "名称不能为空" , groups = {InsertGroup.class})
private String name;
private int grade;
private int classes;
@Valid
private User user;
}
Controller层代码
这里Controller层如果不加@Validated注解,即使实体类里加了校验的注解也不会生效,@RequestBody注解是指参数在请求的body体里
@RestController
public class TestController {
@PostMapping("/getGrade")
public Grade getGrade(@Validated(InsertGroup.class) @RequestBody Grade grade){
return new Grade();
}
}
自定义的分组接口
public interface InsertGroup {
}
这里分组是自定义的一个接口,接口里没有方法。
分组的意义在于不同的场景,同一个实体可能需要校验的规则不同,比如新建的时间,id可以为null,但是更新信息的时间id一定不可以为null。这时就可以用分组区分。
同时分组是可以继承的。
4、疑问
这里有一个疑问就是我有许多参数需要校验,前端如果什么都不传,调用接口会随机返回有校验的参数的提示信息,而不是固定的。不知道有什么办法可以解决