Spring Entity数据校验,分组校验,返回校验结果给前端

简介: Spring Entity数据校验,分组校验,返回校验结果给前端

文档说明

  • 本文用到的项目是我之前写的一个SpringBoot的小demo,去到上一篇文档,项目代码仓库地址点这里

编码步骤

看看SQL语句

-- 用户表
CREATE TABLE `user` (
    `id` BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '用户 ID',
    `username` VARCHAR(20) NOT NULL COMMENT '用户名',
    `password` VARCHAR(20) NOT NULL COMMENT '密码',
    `birthday` DATE COMMENT '出生日期'
);

用户名和密码不能为空,如果前端传入空值我们直接抛出数据完整性异常,说明还是击中数据库了(详见我的上一篇文档

我们可以直接使用数据校验,校验成功后再去插入数据库,减少数据库的压力,首先在原项目的基础上加上一个starter

<!-- 数据校验 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

然后我们就可以使用数据校验的注解了,来了解一下常用注解

  • @javax.validation.constraints.NotNull:不能为空
  • @javax.validation.constraints.Null:必须为空
  • @javax.validation.constraints.Min:限制最小值
  • @javax.validation.constraints.Max:限制最大值
  • @org.springframework.validation.annotation.Validated:表示该数据要数据校验

接下来我们开始编码,去用到其中的一些注解,首先在用户名和密码的属性上添加两个注解

/**
 * 用户名
 */
@NotNull
private String username;
/**
 * 密码
 */
@NotNull
private String password;

然后在 com.xiaohh.user.controllers.UserController 添加用户的方法参数上加上 @Validated 这个注解

public R add(@Validated @RequestBody User user);

然后我们启动看一看情况

可以看到系统因我们做过统一异常处理而抛出了系统未知异常,我们再来看一下到底是啥异常

我们仅需要在统一异常处理器当中加入以下代码(详见我的上一篇文章):

/**
 * 数据校验错误异常
 *
 * @param e 异常对象
 * @return 异常信息
 */
@ExceptionHandler(value = {MethodArgumentNotValidException.class})
public R handleValidateException(MethodArgumentNotValidException e) {
    // 打印日志
    log.error("数据校验出现问题", e);
    // 获取校验错误结果对象
    BindingResult result = e.getBindingResult();
    Map<String, String> validate = new HashMap<String, String>();
    // 获取错误的校验错误信息
    result.getFieldErrors().forEach(item -> {
        // 是哪个属性不合法
        String field = item.getField();
        // 不合法的默认消息
        String message = item.getDefaultMessage();
        // 封装错误信息
        validate.put(field, message);
    });
    return R.error(BizCodeEnum.VALIDATE_EXCEPTION.getCode(), BizCodeEnum.VALIDATE_EXCEPTION.getMessage()).put("data", validate);
}

就可以看到更详细的信息:

消息也可以通过 message 属性来设置

@NotNull(message = "用户名不能为空")
private String username;
@NotNull(message = "密码不能为空")
private String password;

结果:

那么我们现在就完成了一个最基本的校验

分组校验

现在有一个场景,就是更新的时候其他属性可以为空,但是id必须不为空,新增的使用Id为空,那我们肯定就不能用一个注解就草草了事,我们就需要分组进行校验,步骤很简单,跟着我一步步来,首先建立这么一个类:

package com.xiaohh.user.utils;
/**
 * <p>
 * 分组校验的包装类
 * </p>
 *
 * @author XiaoHH
 * @version 1.0
 * @date 2021-03-11 星期四 21:00:03
 * @file ValidateGroup.java
 */
public class ValidateGroup {
    /**
     * 添加数据的分组
     */
    public interface AddGroup { }
    /**
     * 更新数据的分组
     */
    public interface UpdateGroup { }
}

虽然是一个空类,但是分组校验全靠它,我们可以使用校验注解的 groups 属性来定义分组,现在改装一下注解:

/**
 * 用户 ID
 */
@NotNull(groups = {ValidateGroup.UpdateGroup.class}, message = "用户id不能为空")
@Null(groups = {ValidateGroup.AddGroup.class}, message = "用户id必须为空")
private Long id;
/**
 * 用户名
 */
@NotNull(groups = {ValidateGroup.AddGroup.class}, message = "用户名不能为空")
private String username;
/**
 * 密码
 */
@NotNull(groups = {ValidateGroup.AddGroup.class}, message = "密码不能为空")
private String password;

同时我们更改一下Controller里面的注解,分别修改如下:

public R add(@Validated(ValidateGroup.AddGroup.class) @RequestBody User user);
public R update(@Validated(ValidateGroup.UpdateGroup.class) @RequestBody User user);

现在可以测试一下,首先是插入接口:

来一个正确的

然后再测试一下更新

然后看一个正确的

数据校验代码就编写成功了,建议 收藏, 白嫖,要不然你就找不到这么好的远程文章了,代码已经更新到git仓库

精彩预告(更新预告)

相关文章
|
4月前
|
Java 数据库连接 Spring
Spring之数据校验:Validation
【1月更文挑战第17天】 一、Spring Validation概述 二、实验一:通过Validator接口实现 三、实验二:Bean Validation注解实现 四、实验三:基于方法实现校验 五、实验四:实现自定义校验
64 2
Spring之数据校验:Validation
|
5月前
|
前端开发 Java 数据库连接
9:参数校验-Java Spring
9:参数校验-Java Spring
32 0
|
7月前
|
JavaScript 前端开发
前端基础 - JQuery自定义校验器
前端基础 - JQuery自定义校验器
32 0
|
4天前
|
Java Spring
Spring Boot脚手架集成校验框架
Spring Boot脚手架集成校验框架
12 0
|
5天前
|
移动开发 前端开发 JavaScript
前端vue3——实现二次元人物拼图校验
前端vue3——实现二次元人物拼图校验
12 1
|
6天前
|
前端开发 Java 网络架构
[AIGC] Spring 获取前端请求参数的全面指南
[AIGC] Spring 获取前端请求参数的全面指南
|
11天前
|
JSON Java 数据格式
Spring Boot实现各种参数校验
这些是Spring Boot中实现参数校验的一些常见方法,你可以根据项目需求选择适合的方式来进行参数校验。
13 0
|
5月前
|
Java 数据库连接 Maven
【Spring】掌握 Spring Validation 数据校验
【Spring】掌握 Spring Validation 数据校验
131 0
|
6月前
|
Java 测试技术 数据安全/隐私保护
Spring Boot | 一种优雅的参数校验方案(个人总结)
一种优雅的参数校验方案(个人总结)
305 1
Spring Boot | 一种优雅的参数校验方案(个人总结)
|
2月前
|
前端开发 Java Maven
spring boot3参数校验基本用法
spring boot3参数校验基本用法
44 2