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.bootgroupId>
    <artifactId>spring-boot-starter-validationartifactId>
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);

然后我们启动看一看情况

Spring Entity数据校验,分组校验,返回校验结果给前端_第1张图片

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

Spring Entity数据校验,分组校验,返回校验结果给前端_第2张图片

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

/**
 * 数据校验错误异常
 *
 * @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);
}

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

Spring Entity数据校验,分组校验,返回校验结果给前端_第3张图片

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

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

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

结果:

Spring Entity数据校验,分组校验,返回校验结果给前端_第4张图片

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

分组校验

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

package com.xiaohh.user.utils;

/**
 * 

* 分组校验的包装类 *

* * @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);

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

Spring Entity数据校验,分组校验,返回校验结果给前端_第5张图片

来一个正确的

Spring Entity数据校验,分组校验,返回校验结果给前端_第6张图片

然后再测试一下更新

Spring Entity数据校验,分组校验,返回校验结果给前端_第7张图片

然后看一个正确的

Spring Entity数据校验,分组校验,返回校验结果给前端_第8张图片

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

精彩预告(更新预告)

  • 使用maven快速搭建SpringBoot的SSM项目
  • 根据环境选择不同的配置,如开发环境一套配置,测试环境一套生产环境又一套
  • 整合 RestControllerAdvice 做异常统一处理,坚决不把异常抛出给前端
  • 整合 Spring Validated 做数据校验
  • 整合 redis 做数据缓存
  • 整合 Spring Cloud 做微服务注册调用

你可能感兴趣的:(框架,java,spring,spring,boot)