文档说明
编码步骤
看看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仓库
精彩预告(更新预告)
- 使用maven快速搭建SpringBoot的SSM项目
- 根据环境选择不同的配置,如开发环境一套配置,测试环境一套生产环境又一套
- 整合 RestControllerAdvice 做异常统一处理,坚决不把异常抛出给前端
- 整合 Spring Validated 做数据校验
- 整合 redis 做数据缓存
- 整合 Spring Cloud 做微服务注册调用