目录
  • 1.为什么后端要进行数据校验?
  • 2.怎么使用数据校验?(要添加对应依赖)
    • (1)在实体上的属性上添加校验注解:
    • (2)在controller层的方法前加上注解@Validated开启数据校验
    • (3)如果每个方法要校验的参数不同,可以使用分组校验。
  • 实现对手机号码的数据校验:
    • 1.自定义注解:
    • 2.定义号码的校验类
    • 3.自定义校验规则
    • 4.捕获数据校验抛出的异常:
  • 入参对象包含集合时,怎么对集合中的每个属性进行校验
    • 总结

      1.为什么后端要进行数据校验?

      如果新增一个数据,直接在前端页面新增,由于前端代码中有设置数据不能为空,所以不会传入空值。但是不通过前端页面新增一个数据时,比如使用swagger,直接访问后端时,当某个值为空时,可能会被传进数据库,这就会造成一些问题。

      2.怎么使用数据校验?(要添加对应依赖)

      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-validation</artifactId>
          <version>2.3.2.RELEASE</version>
      </dependency>
      

      (1)在实体上的属性上添加校验注解:

      SpringBoot后端数据校验实战操作指南

      SpringBoot后端数据校验实战操作指南

      (2)在controller层的方法前加上注解@Validated开启数据校验

      SpringBoot后端数据校验实战操作指南

      (3)如果每个方法要校验的参数不同,可以使用分组校验。

      实体类上:

      SpringBoot后端数据校验实战操作指南

      SpringBoot后端数据校验实战操作指南

      每个分组都要创建一个对应的接口:

      SpringBoot后端数据校验实战操作指南

      SpringBoot后端数据校验实战操作指南

      controller层开启分组校验:

      SpringBoot后端数据校验实战操作指南

      @Validated注解里面支持多个分组。

      @Valid注解不支持分组校验

      实现对手机号码的数据校验:

      1.自定义注解:

      import com.seckill.validator.IsMobileValidator;
      import javax.validation.Constraint;
      import javax.validation.Payload;
      import java.lang.annotation.*;
      
      @Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
      @Retention(RetentionPolicy.RUNTIME)
      @Documented
      @Constraint(
              validatedBy = {IsMobileValidator.class}
      )
      public @interface IsMobile {
      //    默认为true
          boolean required() default true;
      
          String message() default "手机号码格式错误";
      
          Class<?>[] groups() default {};
      
          Class<? extends Payload>[] payload() default {};
      }

      2.定义号码的校验类

      import org.thymeleaf.util.StringUtils;
      import java.util.regex.Matcher;
      import java.util.regex.Pattern;
      
      /**
       * Description:手机号码校验
       * Date: 2022/6/28 15:28
       **/
      public class PhoneNumberValidator {
      //    正则表达式
          private static final Pattern mobile_pattern=Pattern.compile("^1(3[0-9]|5[0-3,5-9]|7[0-3,5-8]|8[0-9])\\d{8}$");
          public static boolean isMobile(String mobile){
              if(StringUtils.isEmpty(mobile)){
                  return false;
              }
              Matcher matcher = mobile_pattern.matcher(mobile);
              return matcher.matches();
          }
      }
      

      3.自定义校验规则

      import com.seckill.annotations.IsMobile;
      import com.seckill.utils.PhoneNumberValidator;
      import org.thymeleaf.util.StringUtils;
      import javax.validation.ConstraintValidator;
      import javax.validation.ConstraintValidatorContext;
      
      /**
       * Description:自定义校验规则
       * Date: 2022/6/28 16:59
       **/
      public class IsMobileValidator implements ConstraintValidator<IsMobile,String> {
      
      
          private boolean required=false;
          @Override
          public void initialize(IsMobile constraintAnnotation) {
              //先获取到填的值 true/false
              required=constraintAnnotation.required();
          }
      
          @Override
          public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
      //        判断是否为必填
              if(required){  //必填
                  return PhoneNumberValidator.isMobile(s);
      
              }else {  //非必填
                  if(StringUtils.isEmpty(s)){ //非必填时填的值为空时
                      return true;
                  }else{ //非必填时填的值不为空时
                      return PhoneNumberValidator.isMobile(s);
                  }
              }
          }
      }
      

      4.捕获数据校验抛出的异常:

      /**
       * Description:全局异常处理类
       * Date: 2022/6/28 17:35
       **/
      @RestControllerAdvice
      public class GlobalExceptionHandler {
      
          @ExceptionHandler(Exception.class)
          public ResponseBean ExceptionHandler(Exception e){
              if(e instanceof GlobalException){
                  GlobalException ex= (GlobalException) e;
                  return ResponseBean.error(ex.getResponseBeanEnum());
                  //			处理参数校验抛出的异常 BindException
              }else if(e instanceof BindException){
                  BindException ex= (BindException) e;
                  ResponseBean res=ResponseBean.error(ResponseBeanEnum.BINDING_ERROR);
                  res.setMessage("参数校验异常:"+ex.getAllErrors().get(0).getDefaultMessage());
                  return res;
      
              }
              return ResponseBean.error(ResponseBeanEnum.ERROR);
          }
      }

      SpringBoot后端数据校验实战操作指南

      在属性上使用这个注解:

          /** 选手联系电话 */
          @IsMobile(message = "联系电话格式不正确")
          @NotNull(message = "手机号不能为空")
          @Excel(name = "选手联系电话")
          private String phoneNumber;
      

      然后在Controller类上或者方法传入的参数前加@Validated或@Valid注解来开启参数校验。

      入参对象包含集合时,怎么对集合中的每个属性进行校验

      controller层:

      加上@Validated

          @PostMapping
          public AjaxResult addInfo(@RequestBody @Validated TeamInfoDto teamInfoDto)
          {
              return toAjax(comTeamService.insert(teamInfoDto));
          }
      

      实体类中:

      在要校验的集合属性上加@Valid这个注解,否则它只会校验这个集合中元素是否为空,不会校验集合中各个元素

      @Data
      public class TeamInfoDto {
      	@NotEmpty(message = "选手信息不能为空")
          @Valid
          private List<ComUser> user;
      }
      

      对集合中元素数据的限制设置:

      在ComUser实体类中:

      在想要校验的属性上加上对应注解

      public class ComUser extends BaseEntity
      {
          private static final long serialVersionUID = 1L;
      
          private Long id;
      
          /** 选手姓名 */
          @NotNull(message = "姓名不能为空")
          private String name;
      
          /** 选手联系电话 */
          @NotNull(message = "手机号不能为空")
          @IsMobile(message = "手机格式不正确")
          private String phoneNumber;
      
          /** 邮箱 */
          @NotEmpty(message = "邮箱不能为空")
          private String email;
      }
      

      总结

      声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。