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。这时就可以用分组区分。
同时分组是可以继承的。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐