# yx-validator
**Repository Path**: caobinbin_git/yx-validator
## Basic Information
- **Project Name**: yx-validator
- **Description**: spring boot + maven项目,优雅的实现接口参数校验
- **Primary Language**: Java
- **License**: BSD-3-Clause
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 24
- **Created**: 2021-12-04
- **Last Updated**: 2021-12-04
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# yx-validator
2020-01-16 19:03:05 星期四
开发环境版本 `jdk1.8` `maven3.5.0` `spring boot 2.0.2.RELEASE`
# Spring Boot项目如何优雅的实现接口参数校验?
在java后端项目开发过程中,其实有很多大一部分项目,后端都没有做接口参数校验,或者做了参数校验,但是实现方式都是简单的使用if判断;主要原因在于:API的参数校验目前流行的方案较少、现有方案不适用与自己的项目、项目部署在内网要求不高、或者干脆参数校验这种事情丢给前端来实现
## AOP + 注解 实现方法级的参数校验
hibernate-validator是Hibernate项目中的一个数据校验框架,是Bean Validation 的参考实现,也算是当前比较流行的框架了;在实体类上添加注解;但对于不同的方法,所应用的校验规则也是不一样的,这样子可能就会需要创建多个实体类或者组,甚至于一些接口根本就没实体类参数;所以**hibernate-validator实际应用过程中还是有一定的困难**;
**基于此,我花费了一点业余时间,借鉴了hibernate-validator的思路,实现了一套基于 `注解 + AOP` 的方式实现接口参数校验框架**
**在方法体上使用`@CheckParam`或者`@CheckParams`注解标注需要校验的参数;** 举个栗子:
```java
@RestController
@RequestMapping("/paramCheck")
public class ParamCheckController {
@CheckParam(value = Check.NotEmpty, argName = "userName", msg = "你大爷的,这个是必填参数!")
@PostMapping("/singleCheckNotEmpty")
public Object singleCheckNotNull(String userName) {
return 1;
}
@CheckParam(value = Check.DateTime, argName = "dateTime", msg = "msg可以不写,有默认提示")
@PostMapping("/singleCheckDateTime")
public Object singleCheckDateTime(String dateTime) {
return 1;
}
@CheckParams({
@CheckParam(value = Check.NotNull, argName = "userId", msg = "你大爷的,这个是必填参数!"),
@CheckParam(value = Check.NotEmpty, argName = "userName"),
@CheckParam(value = Check.NotEmpty, argName = "dept.deptName", msg = "实体属性判断"),
@CheckParam(value = Check.Past, argName = "dept.createTime"),
@CheckParam(value = Check.lt, argName = "dept.employees", express = "2") // 对集合的size判断
})
@PostMapping("/entityMultiCheck")
public Object entityMultiCheck(Integer userId, String userName, @RequestBody DeptEntity dept) {
return 1;
}
}
```
## 具体方案实现

- 在方法体上使用`@CheckParam`或者`@CheckParams`注解标注需要校验的参数;
- 然后使用AOP切入,获取配置的参数校验规则,同时获取对应的入参值
- 调用CheckUtil工具类,进行判断
- Check参数校验枚举类;目前实现了下列校验方法,后续会继续补充
```java
public enum Check {
Null("参数必须为 null", CheckUtil::isNull),
NotNull("参数必须不为 null", CheckUtil::isNotNull),
Empty("参数的必须为空", CheckUtil::isEmpty),
NotEmpty("参数必须非空", CheckUtil::isNotEmpty),
True("参数必须为 true", CheckUtil::isTrue),
False("参数必须为 false", CheckUtil::isFalse),
Date("参数必须是一个日期 yyyy-MM-dd", CheckUtil::isDate),
DateTime("参数必须是一个日期时间 yyyy-MM-dd HH:mm:ss", CheckUtil::isDateTime),
Past("参数必须是一个过去的日期 ", CheckUtil::isPast),
Future("参数必须是一个将来的日期 ", CheckUtil::isFuture),
Today("参数必须今天的日期 ", CheckUtil::isToday),
Enum("参数必须在枚举中 ", CheckUtil::inEnum),
Email("参数必须是Email地址", CheckUtil::isEmail),
Range("参数必须在合适的范围内", CheckUtil::inRange),
NotIn("参数必须不在指定的范围内 ", CheckUtil::outRange),
Length("参数长度必须在指定范围内", CheckUtil::inLength),
gt("参数必须大于指定值", CheckUtil::isGreaterThan),
lt("参数必须小于指定值", CheckUtil::isLessThan),
ge("参数必须大于等于指定值", CheckUtil::isGreaterThanEqual),
le("参数必须小于等于指定值", CheckUtil::isLessThanEqual),
ne("参数必须不等于指定值", CheckUtil::isNotEqual),
Equal("参数必须不等于指定值", CheckUtil::isEqual),
Pattern("参数必须符合指定的正则表达式", CheckUtil::isPattern) ;
public String msg;
public BiFunction