专业编程教程与实战项目分享平台

网站首页 > 技术文章 正文

Spring Boot 进阶-浅析SpringBoot中如何完成数据校验

ins518 2025-03-11 17:09:39 技术文章 77 ℃ 0 评论


在实际开发中,我们经常会遇到接口数据校验的问题。例如在用户输入手机号、或者是身份证号的时候,我们就需要校验手机号或者身份证号是否输入正确。当然这样的校验在前端页面输入的时候就可以完成。

但是对于直接调用接口的情况则不能通过调用方来进行判断,这就需要我们在Spring Boot中整合对应的校验规则。而在我们Java中经常用到的校验规则就是JSR-303校验规则,下面我们就来看看如何在Spring Boot中整合校验规则。

JSR-303简介

JSR-303规则是 JAVA EE 6 中的一项子规范,叫做 Bean Validation,官方参考实现是Hibernate Validator,这个实现与Hibernate ORM 没有任何关系。JSR 303 用于对 Java Bean 的字段值进行验证。Spring MVC 3.x 之中也大力支持 JSR-303,可以在控制器中对表单提交的数据方便地验证。也可以通过使用注解的方式进行验证。

那么在Spring Boot中如何使用呢?

添加对应的依赖

这里需要注意的是这个验证规则的引入是在Spring Boot中默认引入的所以在这里不需要指定版本号就可以使用了

 
     org.springframework.boot
     spring-boot-starter-validation
 

添加好规则starter之后,下面我们就来看一下这个校验规则为我们提供了那些注解以便我们更加快捷高效地使用。

JSR 303 基本的校验规则

空检查

  • @Null 验证对象是否为null
  • @NotNull 验证对象是否不为null, 无法查检长度为0的字符串
  • @NotBlank 检查约束字符串是不是Null还有被Trim的长度是否大于0,只对字符串,且会去掉前后空格.
  • @NotEmpty 检查约束元素是否为NULL或者是EMPTY.

Booelan检查

  • @AssertTrue 验证 Boolean 对象是否为 true
  • @AssertFalse 验证 Boolean 对象是否为 false

长度检查

  • @Size(min=, max=) 验证对象(Array,Collection,Map,String)长度是否在给定的范围之内
  • @Length(min=, max=) Validates that the annotated string is between min and max included.

日期检查

  • @Past 验证 Date 和 Calendar 对象是否在当前时间之前,验证成立的话被注释的元素一定是一个过去的日期
  • @Future 验证 Date 和 Calendar 对象是否在当前时间之后 ,验证成立的话被注释的元素一定是一个将来的日期
  • @Pattern 验证 String 对象是否符合正则表达式的规则,被注释的元素符合指定的正则表达式,regexp:正则表达式 flags: 指定 Pattern.Flag 的数组,表示正则表达式的相关选项。

数值检查

建议使用在Stirng,Integer类型,不建议使用在int类型上,因为表单值为“”时无法转换为int,但可以转换为Stirng为”“,Integer为null

  • @Min 验证 Number 和 String 对象是否大等于指定的值
  • @Max 验证 Number 和 String 对象是否小等于指定的值
  • @DecimalMax 被标注的值必须不大于约束中指定的最大值. 这个约束的参数是一个通过BigDecimal定义的最大值的字符串表示.小数存在精度
  • @DecimalMin 被标注的值必须不小于约束中指定的最小值. 这个约束的参数是一个通过BigDecimal定义的最小值的字符串表示.小数存在精度
  • @Digits 验证 Number 和 String 的构成是否合法
  • @Digits(integer=,fraction=) 验证字符串是否是符合指定格式的数字,interger指定整数精度,fraction指定小数精度。
  • @Range(min=, max=) 被指定的元素必须在合适的范围内@Range(min=10000,max=50000,message=”range.bean.wage”)
  • @Valid 递归的对关联对象进行校验, 如果关联对象是个集合或者数组,那么对其中的元素进行递归校验,如果是一个map,则对其中的值部分进行校验.(是否进行递归验证)
  • @CreditCardNumber信用卡验证
  • @Email 验证是否是邮件地址,如果为null,不进行验证,算通过验证。
  • @ScriptAssert(lang= ,script=, alias=)
  • @URL(protocol=,host=, port=,regexp=, flags=)

如何使用这些注解呢?

首先在这里先来做一个简单的配置。我们先来创建一个学生类。并且在这个学生类属性上使用对应的注解,代码如下

@Data
public class Student {

    @NotNull(message = "学号不能为空")
    @Min(value = 1,message = "学号不能为负数")
    private Integer studentNo;
    
    @NotBlank(message = "学生姓名不能为空")
    private String studentName;
    
    @Future(message = "提交时间不能为过去的时间")
    private Date submitTime;
}

这里需要注意的是,在我们使用这些注解为属性进行约束的时候可以在同一个属性上注解多个注解,也就是说这个属性会被多个规则所限制,例如学号信息录入规则上就添加了非空注解和判断最小值两个规则。

在上述工作完成之后,我们就需要在Controller层进行使用了,代码如下

@RestController
public class HelloWorldController {

    @PostMapping("/add")
    public String addStudent(@Valid @RequestBody Student student) 
  			throws JsonProcessingException {
       String studentName = student.getStudentName();
       return "提交成功";
    }

}

到这里,运行程序访问接口之后会看到如下结果

但是我们如何让其抛出正常的信息呢?这里就不得不提我们之前文章中写的关于全局异常处理机制。下面我们就来实现一个全局异常处理。

@RestControllerAdvice
public class ExceptionRsHandler {


    @ExceptionHandler(value = {MethodArgumentNotValidException.class,BindException.class})
    public Map onException(Exception e) throws JsonProcessingException{

        BindingResult bindingResult = null;
        if (e instanceof MethodArgumentNotValidException){
            bindingResult = ((MethodArgumentNotValidException) e).getBindingResult();
        }else if (e instanceof BindException){
            bindingResult = ((BindException) e).getBindingResult();
        }
        Map errorMap = new HashMap<>();
        bindingResult.getFieldErrors().forEach((item)->{
            errorMap.put(item.getField(),item.getDefaultMessage());
        });

        return errorMap;
    }


}

添加完全局异常处理之后,我们就会看到如果采用如下方式请求的时候就会提示学生信息不能为空地提示。这也就满足了我们之前描述的场景,在使用接口的时候不需要调用者对传入的参数进行校验。

总结

通过一个简单的学生信息提交的小例子,我们了解了Spring Boot整合JSR-303数据校验的相关内容。在后续的文章中,我们来深入的分析关于整合数据校验之后的一些其他的操作。希望大家多多关注,博主也会为大家带来更多的干货的东西

Tags:

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

欢迎 发表评论:

最近发表
标签列表