计算机系统应用教程网站

网站首页 > 技术文章 正文

使用Annotation注解在实体类中进行参数校验

btikc 2024-09-18 08:37:04 技术文章 20 ℃ 0 评论

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")

三、测试代码

  1. 实体类:

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();
  }
}

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表