SpringBoot中使用(@NotEmpty、@NotBlank、@NotNull)注解校验实体类参数
@NoNull、@NotEmpty等注解无效,以及嵌套对象属性验证无效问题
在进行请求参数的验证时,需要在controller方法的需要验证的参数前面加上该注解,否则Form中的验证注解不起作用。
但是如果是内层对象需要验证的话,需要在里面对象前也加上@valid,这样,无论嵌套多少,都可以验证(包括对象泛型)。
1、引入需要的依赖
<!--参数校验注解所需依赖 spring-boot2.3之后需要单独引入-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
<!--这里版本一般和springboot一样-->
<version>${spring-boot.version}</version>
</dependency>
2、常用注解说明
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或者 @Valid 注解,即使实体类里加了校验的注解也不会生效,@RequestBody注解是指参数在请求的body体里
@RestController
public class TestController {
@PostMapping("/getGrade")
public Grade getGrade(@Validated(InsertGroup.class) @RequestBody Grade grade){
return new Grade();
}
}
@Valid与@Validated都是用来校验接收参数的。
@Valid是使用Hibernate validation的时候使用
@Validated是只用Spring Validator校验机制使用
说明:java的JSR303声明了@Valid这类接口,而Hibernate-validator对其进行了实现。
@Validated与@Valid区别:
@Validated:可以用在类型、方法和方法参数上。但是不能用在成员属性(字段)上,不支持嵌套检测
@Valid:可以用在方法、构造函数、方法参数和成员属性(字段)上,支持嵌套检测\
注意:SpringBoot使用@Valid注解需要引入如下POM
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
自定义的分组接口
public interface InsertGroup {
}
这里分组是自定义的一个接口,接口里没有方法。
分组的意义在于不同的场景,同一个实体可能需要校验的规则不同,比如新建的时间,id可以为null,但是更新信息的时间id一定不可以为null。这时就可以用分组区分。
同时分组是可以继承的。