Spring Boot数据校验

彦士
• 阅读 1180

数据校验是一个相当重要的环节,使用Spring Boot 进行数据校验。

添加校验依赖

Spring Boot数据校验

Spring Boot数据校验

全部依赖文件如下

<?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/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

添加配置文件

user:
  name:
    size: 用户名长度不符合要求
  age:
    size: 年龄输入不正确

添加数据校验

package com.example.demo;

import javax.validation.constraints.DecimalMax;
import javax.validation.constraints.DecimalMin;
import javax.validation.constraints.Size;

public class User {
    private Integer id;
    // 其长度
    @Size(min = 5, max = 10, message = "{user.name.size}")
    private String name;
    // 其上限和下限
    @DecimalMax(value = "200", message = "{user.age.size}")
    @DecimalMin(value = "5", message = "{user.age.size}")
    private Integer age;
    // 省去get和set
}

编写控制器

package com.example.demo;

import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.List;

@RestController
public class UserController {
    @PostMapping("/user")
    public List<String> addUser(@Validated User user, BindingResult bindingResult){
        List<String> errors = new ArrayList<>();
        // 非空
        if(bindingResult.hasErrors()){
            // 查找出Error 进行添加到结果集
            List<ObjectError> allErrors = bindingResult.getAllErrors();
            for (ObjectError allError : allErrors) {
                errors.add(allError.getDefaultMessage());
            }
        }
        return errors;
    }
}

其中BindingResult 类是用于保存错误信息的

测试

Spring Boot数据校验

分组校验

添加分组接口

Spring Boot数据校验

在实体类中添加分组信息

package com.example.demo;

import javax.validation.constraints.DecimalMax;
import javax.validation.constraints.DecimalMin;
import javax.validation.constraints.Size;

public class User {
    private Integer id;
    // 其长度
    @Size(min = 5, max = 10, message = "用户名长度不符合要求", groups = ValidationGroup1.class)
    private String name;
    // 其上限和下限
    @DecimalMax(value = "200", message = "年龄输入不正确", groups = ValidationGroup2.class)
    @DecimalMin(value = "5", message = "年龄输入不正确", groups = ValidationGroup2.class)
    private Integer age;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

控制器使用其分组

package com.example.demo;

import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.List;

@RestController
public class UserController {
    @PostMapping("/user")
    public List<String> addUser(@Validated(ValidationGroup2.class) User user, BindingResult bindingResult){
        List<String> errors = new ArrayList<>();
        // 非空
        if(bindingResult.hasErrors()){
            // 查找出Error 进行添加到结果集
            List<ObjectError> allErrors = bindingResult.getAllErrors();
            for (ObjectError allError : allErrors) {
                errors.add(allError.getDefaultMessage());
            }
        }
        return errors;
    }
}

测试结果

Spring Boot数据校验

微信公众号

Spring Boot数据校验

点赞
收藏
评论区
推荐文章
皕杰报表之数据校验与处理
填报校验分为四种:长度验证、内容校验、计算校验、JavaScript校验。长度校验非空验证就是验证该单元格的值不能为空。内容校验适宜于验证输入内容的格式,譬如:邮箱验证、身份证验证、手机号码验证、邮政编码验证等。计算效验计算效验就是可以进行一些简单的计算校验。JavaScript校验JavaScript校验就是可以与使用一些javascript语言进行校验。
Wesley13 Wesley13
3年前
CRC32用途及写法
CRC32今天在看rocketmq源码时,看到CRC32,就记录下来以供学习。主要用途: 在远距离数据通信中,为确保高效而无差错地传送数据,必须对数据进行校验即差错控制。循环冗余校验CRC(CyclicRedundancyCheck/Code)是对一个传送数据块进行校验,是一种高效的差错控制方法。if(!checksum(c
Easter79 Easter79
3年前
Spring校验@RequestParams和@PathVariables参数
我们在写RestAPI接口时候会用到很多的@RequestParam和@PathVariable进行参数的传递,但是在校验的时候,不像使用@RequestBody那样的直接写在实体类中,我们这篇文章讲解一下如何去校验这些参数。依赖配置要使用JavaValidationAPI,我们必须添加validationap
Wesley13 Wesley13
3年前
MySQL 字符集和校验规则工作流程
MySQL字符集和校验规则工作原理_字符编码相关参数__数据流中的转码过程__校验规则_Tips:字符集和校验规则总是相伴的一从简单的建库语句开始CREATEDATABASEIFNOTEXISTS<db_nameDEFAU
Wesley13 Wesley13
3年前
Java中的参数验证(非Spring版)
1\.Java中的参数验证(非Spring版)1.1.前言为什么我总遇到这种非正常问题,我们知道很多时候我们的参数校验都是放在controller层的传入参数进行校验,我们常用的校验方式就是引入下列的jar包,在参数中添加@Validated,并对Bean对象的参数做不
Wesley13 Wesley13
3年前
@RequestBody参数已经被读取,究竟是何原因?
不知道你们有没有对用户输入的东西进行过敏感校验,如果不进行校验,用户属于一些攻击脚本,那么我们的服务就挂逼啦!所以我们首先需要通过过滤器将用户的数据读出来进行安全校验,这里面涉及到一个动作,就是需要将用户的数据在过滤器中读出来,进行校验,通过之后再放行。问题如果我们的数据是get请求倒还好,但是如果是一些数据量比较大,我们需要通过postjs
Easter79 Easter79
3年前
SpringMVC后台数据校验
第①步:引入依赖<!数据校验<dependency<groupIdorg.hibernate</groupId<artifactIdhibernatevalidator</artifactId<ve
Wesley13 Wesley13
3年前
C#中实现累加校验和计算和校验
为建立中文知识库加块砖       ——中科大胡不归0\.前言如果必须加入一种方法来校验协议数据,累加校验不失为一种好的方案。MD5计算出的Hash太长了,校验和不过1或2个字节,当然MD5的安全性也不是校验和能比的。1\.校验和原理1.1发送方生成检验和1.将发送的进行检验和运算的数据分成若干个16位
文盘Rust -- struct 中的生命周期
最近在用rust写一个redis的数据校验工具。redisrs(https://github.com/redisrs/redisrs)中具备redis::ConnectionLiketrait,借助它可以较好的来抽象校验过程。在开发中,
SpringBoot如何优雅的进行参数校验(一)
SpringBoot如何优雅的进行参数校验一.为什么要进行参数校验在日常的开发过程中,我们常常需要对传入的参数进行校验,比如在web前后端分离项目中,参数校验有两个方面:前端进行参数校验后端进行参数校验那这两种有什么区别呢?只完成一个可不可以呢?答案是不可
彦士
彦士
Lv1
勇于面对让你感到焦虑的事情。
文章
3
粉丝
0
获赞
0