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天前
|
存储 运维 安全
Spring运维之boot项目多环境(yaml 多文件 proerties)及分组管理与开发控制
通过以上措施,可以保证Spring Boot项目的配置管理在专业水准上,并且易于维护和管理,符合搜索引擎收录标准。
15 2
|
5月前
|
JSON 前端开发 JavaScript
前端上传文件前校验文件数据
该文介绍了如何在Vue项目中实现批量导入Excel数据的校验。使用Element UI的`el-upload`组件上传文件,通过FileReader读取内容,结合XLSX库解析Excel为JSON。解析过程包括将二进制数据转换为workbook对象,提取worksheet并转化为JSON。之后,遍历JSON数据进行字段校验,若发现空值则记录错误。提供的Demo展示了选择Excel文件后控制台显示校验结果。技术栈包括vue 2.6.14、element ui 2.15.14和xlsx 0.17.0。建议将此类功能封装为通用组件以复用。
98 2
前端上传文件前校验文件数据
|
4月前
|
前端开发 JavaScript Java
Spring Boot中的数据校验
Spring Boot中的数据校验
|
3月前
|
前端开发 JavaScript 数据安全/隐私保护
前端JS正则校验密码之3种实现方式
这篇文章展示了三种使用JavaScript正则表达式来校验密码的方法,密码需要满足包含大写字母、小写字母、数字及特殊字符,并在8到16位之间,同时提供了示例代码和实现效果。
99 1
前端JS正则校验密码之3种实现方式
|
3月前
|
前端开发 Java Spring
Spring与Angular/React/Vue:当后端大佬遇上前端三杰,会擦出怎样的火花?一场技术的盛宴,你准备好了吗?
【8月更文挑战第31天】Spring框架与Angular、React、Vue等前端框架的集成是现代Web应用开发的核心。通过RESTful API、WebSocket及GraphQL等方式,Spring能与前端框架高效互动,提供快速且功能丰富的应用。RESTful API简单有效,适用于基本数据交互;WebSocket支持实时通信,适合聊天应用和数据监控;GraphQL则提供更精确的数据查询能力。开发者可根据需求选择合适的集成方式,提升用户体验和应用功能。
92 0
|
3月前
|
前端开发 JavaScript Java
【Azure 应用服务】App Service For Windows 中如何设置代理实现前端静态文件和后端Java Spring Boot Jar包
【Azure 应用服务】App Service For Windows 中如何设置代理实现前端静态文件和后端Java Spring Boot Jar包
|
4月前
|
前端开发 JavaScript 开发工具
前端优化之路:git commit 校验拦截
前面在git分支规范那篇文章里,介绍了commit提交规范,但是想要做到高效落地执行,就需要做些别的功课。
|
5月前
|
前端开发 Java 微服务
Spring Boot与微前端架构的集成开发
Spring Boot与微前端架构的集成开发
|
5月前
|
运维 Java 关系型数据库
Spring运维之boot项目bean属性的绑定读取与校验
Spring运维之boot项目bean属性的绑定读取与校验
53 2
|
4月前
|
Java 数据库连接 测试技术
在Spring Boot中实现数据校验与验证
在Spring Boot中实现数据校验与验证