看看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>
然后我们就可以使用数据校验的注解了,来了解一下常用注解
接下来我们开始编码,去用到其中的一些注解,首先在用户名和密码的属性上添加两个注解
/**
* 用户名
*/
@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;
/**
*
* 分组校验的包装类
*
*
* @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仓库