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

目录
  • 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)在实体上的属性上添加校验注解:

(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 {
//    默认为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);
    }
}

在属性上使用这个注解:

    /** 选手联系电话 */
    @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;
}

总结

到此这篇关于SpringBoot后端数据校验的文章就介绍到这了,更多相关SpringBoot后端数据校验内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • SpringBoot后端进行数据校验JSR303的使用详解

    如果只想查看注解,请跳到文章末尾部分 简介 在前后端进行数据交互中,在前端把数据传送到后端前,一般会先进行校验一次,校验成功之后,才把数据发送到后端.但是我们在服务端还得在对数据进行一次校验.因为请求数据发送的链接很容易获取,可以不经过前端界面,使用postman等工具直接向后台发送数据,这就可能造成发送的数据是不合法的情况. 项目创建 首先创建一个springboot项目 使用的springboot版本为:(本文代码以该版本为准,不同版本springboot,在下面内容会出现一些差异) <pa

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

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

  • Spring-Validation 后端数据校验的实现

    前言 最近看到很多童鞋在项目中的对请求参数的校验都用的if来判断各参数的属性,如: if(StringUtils.isBlank(username)){ return RR.exception("账号不能为空"); } if(StringUtils.isBlank(password)){ return RR.exception("密码不能为空"); } if(StringUtils.isBlank(realName)){ return RR.exception(&q

  • springboot中validator数据校验功能的实现

    普通校验 导入依赖: 默认的报错:没有提示具体的属性 设置自己的错误信息提示:创建 ValidationMessages.properties 内容如下: user.id.notnull = id 不能为空 user.username.size = username 长度为5-10 user.age.min = age 年龄最小为1 user.age.max = age 年龄最大为100 user.email.pattern= email 格式不正确 实体类注解上设置message属性,,使用{

  • SpringBoot Validation快速实现数据校验的示例代码

    目录 前言 环境配置 使用示例 分组 前言 在实际开发中,肯定会经常遇到对参数字段进行校验的场景,虽然大多数情况下前端都会进行校验,但我们知道前端并不可信,所以后台也需要进行校验,通常我们只能写大量的if else来完成校验工作,而如果使用SpringBoot Validation则可以轻松的通过注解来完成. 环境配置 引入Jar包 <dependency> <groupId>org.springframework.boot</groupId> <artifact

  • SpringBoot全局异常与数据校验的方法

    异常处理是每个项目中都绕不开的话题,那么如何优雅的处理异常,是本文的话题.本文将结合SpringBoot框架一起和大家探讨下. 要思考的问题 在现在的前后端交互中,通常都规范了接口返回方式,如返回的接口状态(成功|失败)以及要返回的数据在那个字段取,或者说失败了以后提示信息从接口哪里返回,因此,如果想做全局异常,并且异常发生后能准确的返回给前端解析,那么需要异常发生时返回给前端的格式与正常失败场景的格式一致. 项目建立 利用idea 工具,很容易的搭建一个SpringBoot项目,要引入的mav

  • SpringBoot服务端数据校验过程详解

    这篇文章主要介绍了SpringBoot服务端数据校验过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 对于任何一个应用而言,客户端做的数据有效性验证都不是安全有效的,而数据验证又是一个企业级项目架构上最为基础的功能模块,这时候就要求我们在服务端接收到数据的时候也对数据的有效性进行验证.为什么这么说呢?往往我们在编写程序的时候都会感觉后台的验证无关紧要,毕竟客户端已经做过验证了,后端没必要在浪费资源对数据进行验证了,但恰恰是这种思维最为容易

  • AJAX SpringBoot 前后端数据交互的项目实现

    目录 1.Ajax概述 2.基于JQuery的AJAX语法 1. Ajax 概述 Ajax 的英文全称是 ”Asynchronous JavaScript and XML“,即 ”异步的 JavaScript 和 XML“.其核心是通过 JavaScript 的 XMLHttpRequest 对象,以一种异步的方式,向服务器发送数据请求,并且通过该对象接收请求返回的数据,从而实现客户端与服务器端的数据交互. 优点:Ajax 能够刷新指定的页面区域(局部刷新),而不是刷新整个页面,从而减少客户端和

  • SpringBoot数据校验及多环境配置的问题详解

    目录 1. 数据校验 2. 多环境配置 3. 配置文件加载位置 4. 总结 接上节,本节补充一下数据校验及多环境配置的内容,仍是 SpringBoot-02-Config 项目. 1. 数据校验 使用数据校验,可以在输入不合法数据时抛出异常,首先要添加 validation 的依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-

  • SpringBoot数据校验功能的实现

    1.pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM

随机推荐