@ParamsValidate系列教程 https://blog.csdn.net/u010606397/article/category/7689866
web后端校验请求参数是一个很常用的功能,java web普遍使用spring validation来校验。我自己也写了一个校验请求参数的库params-validate,跟spring validation相比还是有些小优点的,比如:
1、不需要改动pojo类。
2、使用map接收参数时,也可以校验参数。
新建一个controller方法:
public Object demo1(@RequestBody User user){}
//User类
public class User {
private String id;
private String name;
private String birthday;
private Boolean single;
private Float salaryNum;
private BigDecimal bigNum;
限于篇幅,省略一大堆get、set方法
}
对前端传参有如下要求:
name: 只能是字母、数字、_,必填,最小长度10,最大长度100
birthday:必填
single: 只能是Boolean型
salaryNum:只能是正数,必填,最小值100,最大值1000
bigNum: 只能是正数或0
用params-validate可实现这个校验功能。
1、导入依赖
<dependency>
<groupId>com.github.codingsoldier</groupId>
<artifactId>params-validate</artifactId>
<version>1.8-RELEASE</version>
<!--版本不能低于1.8,最新版本请查看:
https://mvnrepository.com/artifact/com.github.codingsoldier/params-validate -->
<exclusions>
<!--排除重复的依赖-->
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
</exclusion>
</exclusions>
</dependency>
2、新建ValidateInterfaceAdapter子类。ValidateInterfaceAdapter是一个虚拟类,必须新建可实例化的子类,且注入到IOC容器中。
@Component
public class ValidateInterfaceImpl extends ValidateInterfaceAdapter{
}
3、在resources目录下新建文件夹validate(文件夹名称必须是validate),在validate下新建一个json文件learn-params-validate.json(json文件名可随意写),如下图红色箭头所示。
learn-params-validate.json中填写如下内容:
{
"userValidate": {
"name": {
"request": true,
"minLength": 10,
"maxLength": 100,
"regex": "^[a-zA-Z0-9_]+$",
"message": "名字必须是字母、数字、_"
},
"birthday": {
"request": true
},
"single": {
"regex": "^(true)$|^(false)$",
"message": "single必须是true、false"
},
"salaryNum": {
"request": "true",
"minValue": 100,
"maxValue": 1000,
"regex": "^(\\+)?\\d+(\\.\\d+)?$",
"message": "薪水必须是正数"
},
"bigNum": {
"regex": "^(\\+)?\\d+(\\.\\d+)?$",
"message": "bigNum必须正数或0"
}
}
}
4、新建controller
@RestController
@RequestMapping("/learn")
public class LearnParamsValidate {
@PostMapping("/demo1")
/**
* 添加校验注解@ParamsValidate
* file的值是第三步的json文件learn-params-validate.json
* key的值是learn-params-validate.json中的userValidate
*/
@ParamsValidate(file = "/learn-params-validate.json", key = "userValidate")
public Object demo1(@RequestBody User user){
System.out.println("demo1方法执行");
Map<String, Object> map1 = new HashMap<>();
map1.put("code", 0);
map1.put("data", "成功");
return map1;
}
}
使用postman发送一个请求,如下图:
还记得对前端传参的要求吗?要求如下:
name: 只能是字母、数字、_,必填,最小长度10,最大长度100
birthday:必填
single: 只能是Boolean型
salaryNum:只能是正数,必填,最小值100,最大值1000
bigNum: 只能是正数或0
前端传参只有single符合要求,其他参数都不符合。通过编辑器的控制台和postman请求结果可以看出controller.demo1()方法没有执行。原因是此请求会被@ParamsValidate拦截,前端传参不符合要求,不执行controller方法,返回参数校验信息给前端。
下面把参数改正确,再发一次请求,通过下图、编辑器的控制台可以看到controller.demo1()方法执行了。
至此,一个简单的params-validate使用方法就介绍完了。
下面我细说下json文件校验规则
1、在validate目录下新建一个json文件。用一个key框住所有请求参数的key。
用userValidate框住所有请求参数的key
"userValidate": {
"name": {
...
},
"birthday": {
...
},
...
}
2、对需要校验的请求参数编写校验规则。
"request": true表示必填,false表示可为空,不写request表示可为空
"minValue": 最小值
"maxValue": 最大值
"minLength": 最小长度
"maxLength": 最大长度
"regex": 正则表达式
"message": 参数未通过校验,返回提示信息
最后,在controller方法上添加注解@ParamsValidate(file="json文件名", key="userValidate")就可以对参数进行校验了。