文章目录

  • 1.为什么后端要进行数据校验?
  • 2.怎么使用数据校验?(要添加对应依赖)
  • 实现对手机号码的数据校验:
  • 入参对象包含集合时,怎么对集合中的每个属性进行校验

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

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

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

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

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


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

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

实体类上:


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


controller层开启分组校验:

@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 {//    默认为trueboolean 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;@Overridepublic void initialize(IsMobile constraintAnnotation) {//先获取到填的值 true/falserequired=constraintAnnotation.required();}@Overridepublic 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);}
}


在属性上使用这个注解:

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

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

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

controller层:
加上@Validated

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

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

@Data
public class TeamInfoDto {@NotEmpty(message = "选手信息不能为空")@Validprivate 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;
}

SpringBoot中后端数据校验相关推荐

  1. SpringBoot后端数据校验实战

    本文从本人博客搬运,原文格式更加美观,可以移步原文阅读:SpringBoot后端数据校验实战 一般我们会在Controller的接口中对前端传递的参数做数据校验,这是一个后端开发人员的基本素养 在Sp ...

  2. SpringBoot - 后端数据校验的实现

    SpringBoot - 后端数据校验的实现 通常来说,为了提高系统运行效率,都会在前端进行数据校验,但后端的数据校验仍然必不可少,因为用户还是可能在获取数据接口后手动传入非法数据,所以后端还是需要做 ...

  3. 实现Java后端数据校验

    每次我们在搭建一个开源项目的首要任务包括:项目的统一异常处理.统一结果封装以及做项目的数据校验,在前后端分离的情况下,不仅前端需要做数据校验,同样后端也要实现,前端主要使用一些类似与jQuery Va ...

  4. 后端数据校验之JSR303

    后端数据校验之JSR303 JSR303的使用 分组校验 自定义校验规则 一般在项目开发中,对数据准确性的校验必不可少,除了前端对数据进行校验,后端也要对数据进行校验. JSR303的使用 JSR30 ...

  5. [WPF 基础知识系列] —— 绑定中的数据校验Vaildation

    [WPF 基础知识系列] -- 绑定中的数据校验Vaildation 原文:[WPF 基础知识系列] -- 绑定中的数据校验Vaildation 前言: 只要是有表单存在,那么就有可能有对数据的校验需 ...

  6. java 护照校验,Java应用中的数据校验

    翻译:叩丁狼教育吴嘉俊 [译者注:这篇文章是开源项目CUBA Platform的作者,在这篇文章中,作者阐述了CUBA平台中关于数据校验的设计思想和使用方式,可以作为大家在设计数据校验方面一个比较好的 ...

  7. springboot后端数据校验以及异常处理

    文章目录 常用校验工具包 1.package javax.validation.constraints 包 2.package org.hibernate.validator.constraints; ...

  8. SpringBoot——服务端数据校验

    Spring Validator和Hibernate Validator是两套Validator,可以混着用,这里我们用Hibernate Validator 一.添加依赖: 添加依赖的时候注意不要添 ...

  9. springboot validated注解数据校验 异常处理

    springboot validated 数据校验 validated 数据校验 简单的写一下这个用法啊,清晰的本篇文章就记录这个注解的一个用法. validated 数据校验 我们一般的数据校验是怎 ...

最新文章

  1. IDC发布对话式人工智能白皮书|附下载
  2. Bootstrap3.1开发的响应式个人简历模板
  3. 15 -Flask构建弹幕微电影网站-基于角色的访问控制
  4. oracle锁表语句执行提示无法终止当前对话_显示Oracle数据库表或行上持有锁的所有会话...
  5. 文件服务器 双机,文件服务器双机备份
  6. 解決memcache 有時無法連接的問題
  7. HDU4394(数论中的广搜)
  8. 从零开始玩转JMX(二)——Condition
  9. Java高级语法笔记-枚举类型
  10. 孪生网络图像相似度_孪生网络:使用双头神经网络进行元学习
  11. 【java】java JVM如何科学的设置内存参数 虚拟机调优案例
  12. Linux CentOS安装JDK
  13. viewUrl 终结者
  14. 三菱plc pwm指令_三菱PLC高速处理指令编程
  15. 如何查询电脑最大可扩展内存
  16. MATLAB角度转换
  17. 检查macOS中硬盘是否健康的小技巧
  18. php正则替空行,正则匹配空行实例
  19. 知识图谱嵌入(KGE)主流模型简介
  20. java对象强制类型转换,看完直接跪服

热门文章

  1. linux安装tomcat_软件测试基础——Linux系统安装Tomcat
  2. 几何问题。点线向量面积等模版。
  3. 人类文明史的发展形态
  4. Exhaustive search 和 Beam search 详解(图文并茂)
  5. Mybatis(一)之概述
  6. MySQL5.7.5及以上执行group by报错
  7. 第26课时,实践1,投票表决器
  8. 充分利用大内存提升电脑速度
  9. 【第九篇】Flowable中的候选人讲解
  10. NAT(网络地址转换)小实验