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

 更新时间:2022年07月06日 11:09:45   作者:星域_03zhan  
在项⽬开发中,对于前端提交的表单,后台接⼝接收到表单数据后,为了保证程序的严谨性,通常后端会加⼊业务参数的合法校验操作来避免程序的⾮技术性 bug,这篇文章主要给大家介绍了关于SpringBoot后端数据校验的相关资料,需要的朋友可以参考下

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后端数据校验内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • aop注解方式实现全局日志管理方法

    aop注解方式实现全局日志管理方法

    下面小编就为大家分享一篇aop注解方式实现全局日志管理方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-01-01
  • idea2023远程调试springboot的过程详解

    idea2023远程调试springboot的过程详解

    这篇文章主要介绍了idea2023远程调试,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-08-08
  • springBoot启动时让方法自动执行的几种实现方式

    springBoot启动时让方法自动执行的几种实现方式

    这篇文章主要介绍了springBoot启动时让方法自动执行的几种实现方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • java IO 文件操作方法总结

    java IO 文件操作方法总结

    这篇文章主要介绍了java IO 文件操作方法总结的相关资料,需要的朋友可以参考下
    2017-04-04
  • JAVA的反射机制你了解多少

    JAVA的反射机制你了解多少

    这篇文章主要为大家详细介绍了JAVA的反射机制,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-02-02
  • JAVA截取字符串的几种常用方法

    JAVA截取字符串的几种常用方法

    这篇文章主要给大家介绍了关于JAVA截取字符串的几种常用方法, 在处理字符串的过程中有很多情况下会遇到需要截取字符串的情况,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-09-09
  • SpringBoot+JSON+AJAX+ECharts+Fiddler实现前后端分离开发可视化

    SpringBoot+JSON+AJAX+ECharts+Fiddler实现前后端分离开发可视化

    这篇文章主要介绍了SpringBoot+JSON+AJAX+ECharts+Fiddler实现前后端分离开发可视化,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • Java中list集合为空或为null的区别说明

    Java中list集合为空或为null的区别说明

    这篇文章主要介绍了Java中list集合为空或为null的区别说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • 图解Spring容器中实例化bean的四种方式

    图解Spring容器中实例化bean的四种方式

    这篇文章主要介绍了图解Spring容器中实例化bean的四种方式,传统应用程序可以通过new和反射方式进行实例化Bean,而Spring IOC容器则需要根据 Bean 定义里的配置元数据,使用反射机制来创建Bean,需要的朋友可以参考下
    2023-11-11
  • 浅谈Java数据结构之稀疏数组知识总结

    浅谈Java数据结构之稀疏数组知识总结

    今天带大家了解一下Java稀疏数组的相关知识,文中有非常详细的介绍及代码示例,对正在学习java的小伙伴们有很好地帮助,需要的朋友可以参考下
    2021-05-05

最新评论