SpringBoot中提供了可以给实体类上的参数加入校验,对于前端请求的数据进行校验。比如数据的长度、格式、类型、是否为空等等,如果没有通过校验就直接报错,大大的减少了在业务代码判断以及防止脏数据对数据库的影响。
一、在maven引入依赖:
<!--第一种方式导入校验依赖-->
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
<!--第二种方式导入校验依赖-->
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
</dependency>
二、实体类中常用注解
- @Null:被注释的元素必须为null
- @NotNull:被注释的元素不能为null
- @AssertTrue:该字段只能为true
- @AssertFalse:该字段的值只能为false
- @Min(value):被注释的元素必须是一个数字,其值必须大于等于指定的最小值
- @Max(value):被注释的元素必须是一个数字,其值必须小于等于指定的最大值
- @DecimalMin(“value”):被注释的元素必须是一个数字,验证小数的最小值
- @DecimalMax(“value”):被注释的元素必须是一个数字,验证小数的最大值
- @Size(max,min):查该字段的size是否在min和max之间,可以是字符串、数组、集合、Map等
- @Past:被注释的元素必须是一个过去的日期
- @Future:被注释的元素必须是一个将来的日期
- @Pattern(regexp = “[abc]”):被注释的元素必须符合指定的正则表达式。
- @Email:被注释的元素必须是电子邮件地址
- @Length(max=5,min=1,message=“长度在1~5”):检查所属的字段的长度是否在min和max之间,只能用于字符串
- @NotEmpty:被注释的字符串必须非空
- @Range:被注释的元素必须在合适的范围内
- @NotBlank:不能为空,检查时会将空格忽略
- @NotEmpty:不能为空,这里的空是指空字符串
- @TableField(exist = false) 字段不新增数据库
- @TableField(updateStrategy = FieldStrategy.NOT_EMPTY,jdbcType = JdbcType.VARCHAR) 如果字段为空的时候 不修改
- @JsonFormat:时间格式化注解(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
三、测试代码
- 实体类:
import lombok.Data;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.Range;
import org.springframework.format.annotation.DateTimeFormat;
import javax.validation.constraints.*;
import java.math.BigDecimal;
import java.util.Date;
/**
* @author hope
* @date 2023年08月21日 15:19
*/
@Data
public class TestDTO {
/*************************** 值校验 *****************************/
/**
* 被注解的元素必须为null
**/
@Null(message = "修改人必须为空")
private String updateBy;
/**
* 被注解的元素必须不为null
**/
@NotNull(message = "用户名不能为空")
private String username;
/**
* 验证注解的元素值不为空(不为null、去除首位空格后长度为0),并且类型为String
**/
@NotBlank(message = "编码必须不为空")
private String code;
/**
* 验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0) ,并且类型为String
**/
@NotEmpty(message = "key必须不为null且不为空")
private String key;
/**
* 被注解的元素必须为true,并且类型为boolean
**/
@AssertTrue(message = "必须为true")
private boolean status;
/**
* 被注解的元素必须为false,并且类型为boolean
**/
@AssertFalse(message = "必须为false")
private boolean deviceStatus;
/*************************** 范围校验 *****************************/
/**
* 被注解的元素其值必须大于等于最小值,并且类型为int,long,float,double
**/
@Min(value = 18, message = "必须大于等于18")
private int age;
/**
* 被注解的元素其值必须小于等于最小值,并且类型为int,long,float,double
**/
@Max(value = 100, message = "必须小于等于100")
private int num;
/**
* 验证注解的元素值大于等于@DecimalMin指定的value值,并且类型为BigDecimal
**/
@DecimalMin(value = "50", message = "必须大于等于50")
private BigDecimal height;
/**
* 验证注解的元素值小于等于@DecimalMax指定的value值 ,并且类型为BigDecimal
**/
@DecimalMax(value = "100", message = "必须大于等于100")
private BigDecimal money;
/**
* 验证注解的元素值在最小值和最大值之间,并且类型为BigDecimal,BigInteger,CharSequence,byte,short,int,long
**/
@Range(min = 10, max = 100, message = "必须大于等于10或小于等于100")
private int deviceNum;
/**
* 被注解的元素必须为过去的一个时间,并且类型为java.util.Date
**/
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@Past(message = "必须为过去的时间")
private Date createDate;
/**
* 被注解的元素必须为未来的一个时间,并且类型为java.util.Date
**/
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@Future(message = "必须为未来的时间")
private Date endDate;
/*************************** 长度校验 *****************************/
/**
* 被注解的元素的长度必须在指定范围内,并且类型为String,Array,List,Map
**/
@Size(min = 5, max = 20, message = "长度必须大于等于5或小于等于20")
private String tel;
/**
* 验证注解的元素值长度在min和max区间内 ,并且类型为String
**/
@Length(min = 100, max = 500, message = "长度必须大于等于100或小于等于500")
private String distance;
/*************************** 格式校验 *****************************/
/**
* 验证注解的元素值的整数位数和小数位数上限 ,并且类型为float,double,BigDecimal
**/
@Digits(integer=3,fraction = 2,message = "整数位上限为3位,小数位上限为2位")
private BigDecimal area;
/**
* 被注解的元素必须符合指定的正则表达式,并且类型为String
**/
@Pattern(regexp = "\\d{11}",message = "必须为数字,并且长度为11")
private String mobile;
/**
* 验证注解的元素值是Email,也可以通过regexp和flag指定自定义的email格式,类型为String
**/
@Email(message = "必须是邮箱")
private String email;
}
2. Controller
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import tech.JD.CODE.common.core.util.R;
import javax.validation.Valid;
/**
* @author hope
* @date 2023年08月21日 15:25
*/
@RestController
@RequestMapping("test")
@Api(tags = {"[測試]接口"})
@Slf4j
@AllArgsConstructor
public class TestController {
@ApiOperation(value = "測試接口1")
@GetMapping(value = "/testGet")
public R testGet(@Valid TestDTO dto) {
return R.ok();
}
@ApiOperation(value = "測試接口2")
@PostMapping(value = "/testPost")
public R testPost(@Valid @RequestBody TestDTO dto) {
return R.ok();
}
}
本文暂时没有评论,来添加一个吧(●'◡'●)