0
点赞
收藏
分享

微信扫一扫

SpringBoot中使用注解校验实体类参数


SpringBoot中使用注解校验实体类参数

  • ​​1、引入需要的依赖​​
  • ​​2、常用注解说明​​
  • ​​3、@Valid与@Validated的区别​​
  • ​​3.1、 注解使用的地方​​
  • ​​3.2、 分组​​
  • ​​4、疑问​​

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、 注解使用的地方

  1. @Valid:可以用在方法、构造函数、方法参数和成员属性(字段)上
  2. @Validated:可以用在类型、方法和方法参数上。但是不能用在成员属性(字段)上

3.2、 分组

  1. @Valid没有分组的功能
  2. @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、疑问

这里有一个疑问就是我有许多参数需要校验,前端如果什么都不传,调用接口会随机返回有校验的参数的提示信息,而不是固定的。不知道有什么办法可以解决


举报

相关推荐

0 条评论