# 实体类Bean校验器
**Repository Path**: stan1281047913/bean-validator
## Basic Information
- **Project Name**: 实体类Bean校验器
- **Description**: 实体类Bean校验器,对获取的bean参数进行校验。支持注解方式校验、内置校验器校验、自定义规则校验等。如果内置校验器不满足业务场景需求,可以排除、重置、自定义属性的校验规则,以达到您的业务场景
- **Primary Language**: Java
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 7
- **Forks**: 3
- **Created**: 2020-06-13
- **Last Updated**: 2025-02-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
## 实体类Bean校验器
#### 作者:stan
#### 版本:V1.2.0
#### [我的博客](https://blog.csdn.net/qq_18601953)
***
#### 【目录】
[实体类Bean校验器是什么?](#jump1)
[实体类Bean校验器能做什么?](#jump2)
[怎么使用实体类Bean校验器?](#jump3)
[历史版本](#jump4)
***
#### 实体类Bean校验器是什么?
> 在平时的业务开发当中,后台开发人员需要对前端传送的数据进行再次校验,
如果每次都写大量的if...else...语句块,会大量浪费开发人员的时间。
同时防止不法人员绕过系统前端页面直接调用API接口的,增加API接口的安全性。
---
#### 实体类Bean校验器能做什么?
* 不安全
> 绕过系统页面直接请求API,校验不严格可能导致系统错误。
* 开发高效
> 减少开发人员重复编写校验字段代码,专注业务开发,提高开发效率。
* 简洁
> 减少大量重复的if...else...校验代码,使得代码更整洁,结构更清晰,优美。
* 内置校验规则注解
- [x] 非空校验 `@NotEmpty`
- [x] 数字校验 `@Number`
- [x] 身份证校验 `@IDCard`
- [x] Email校验 `@Email`
- [x] 固定电话校验 `@Tel`
- [x] 手机号码校验 `@Mobile`
- [x] 邮编校验`@PostCode` 注:目前仅支持中国、美国、日本邮编校验
- [x] 自定义校验 `@Pattern`
> @Pattern(msg = "校验失败提示语",name = "属性名",ex="正则表达式")
***
#### 怎么使用实体类Bean校验器?
> 实体类Bean校验器使用方法及其简单。
- 1 实体类使用校验注解
```Java
/**
* 用户信息
* @author stan
* @Date 2020/6/8 10:52
* @version 1.0
*/
@Data
public class UserInfo {
@NotEmpty(msg = "用户名不能为空!",name = "用户名")
private String userName;
@Number(msg = "年龄不能为空!",name = "年龄")
private Integer age;
@IDCard(msg = "身份证校验失败!",name = "身份证")
private String idNumber;
@Email(msg = "邮箱格式有误!",name = "邮箱")
private String email;
@Tel(msg = "固定电话格式有误!请正确填写,例如:0755-26802502 或者 26802502",name = "固定电话")
private String tel;
@Mobile(msg = "手机号码格式有误!",name = "手机号码")
private String phone;
/** 学校-默认不需要校验 **/
private String school;
}
```
- 2 controller中使用
- 2.1 使用实体类Bean校验器对添加了校验注解的Bean进行校验
- 例子:
```Java
/**
* 校验已添加自定义注解的属性
* @author stan
* @Date 2020/6/9 17:38
* @version 1.0
*/
@RequestMapping("/validator")
public String validator(UserInfo userInfo) throws Exception{
ValidateResult result = BeanValidatorFactory.validate(userInfo);
if(!result.isResult()){
return JSONObject.toJSONString(result);
}
return "校验成功!欢迎使用Bean校验器工厂校验";
}
```
- 2.2 排除Bean中某些已添加校验注解的属性
- 例子:
```Java
/**
* 排除不校验的属性
* @author stan
* @Date 2020/6/9 17:38
* @version 1.0
*/
@RequestMapping("/excludes")
public String excludes(UserInfo userInfo) throws Exception{
Set excludes = new HashSet<>();
excludes.add("email");
excludes.add("idNumber");
ValidateResult result = BeanValidatorFactory.validate(userInfo,excludes);
if(!result.isResult()){
return JSONObject.toJSONString(result);
}
return "校验成功!欢迎使用Bean校验器工厂校验-不校验指定字段";
}
```
- 2.3 动态添加需要校验的属性,如果原有属性上有自定义校验注解,将按照新的校验格式校验
- 例子:
```Java
/**
*@Description 添加其他校验属性
* 如果原有属性上有自定义校验注解,将按照新的校验格式校验
*@Author stan
*@Date 2020-06-13 12:15
*@Param
*@return
*/
@RequestMapping("/addField")
public String addFile(UserInfo userInfo) throws Exception{
Set patternFields = new HashSet<>();
PatternField patternField = new PatternField();
patternField.setFieldName("idNumber");
patternField.setRegx("\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*");
patternField.setMsg("身份证验证失败,改成邮箱验证格式!");
patternFields.add(patternField);
PatternField patternField1 = new PatternField();
patternField1.setFieldName("school");
patternField1.setRegx("\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*");
patternField1.setMsg("学校名称验证失败,改成邮箱验证格式!");
patternFields.add(patternField1);
ValidateResult result = BeanValidatorFactory.validate(userInfo,patternFields);
if(!result.isResult()){
return JSONObject.toJSONString(result);
}
return "校验成功!欢迎使用Bean校验器工厂校验-添加字段校验格式";
}
```
- 2.4 通过注解方式校验
- 例子:
```java
/**
*@Description 测试注解形式
* 排除不校验属性格式:
* name|...|age|
*
* 动态添加需要校验属性格式:
* name;ex;msg|...|age;ex;msg
*@Author stan
*@Date 2020-06-21 15:00
*@Param
*
*@return
*/
@BeanValidate(clazz = UserInfo.class,excludes = "userName",addPattern = "userName;\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*;改为邮箱格式!")
@RequestMapping("/ann")
public String annotation(UserInfo userInfo){
ValidateResult validateResult = BeanValidateSingletonFactory.getInstance().getValidateResult();
if(!validateResult.isResult()){
return JSONObject.toJSONString(validateResult);
}
return "注解校验器校验成功!";
}
```
***
### 历史版本
> 版本号:Version 1.2.1
更新时间:2020-07-12
更新内容:
- 1.添加邮编校验器,目前仅支持中国、美国、日本邮编校验
- 2.使用委派模式,通过邮编委派适配器选择合适的邮编校验执行者
- 3.添加邮编校验注解`@postCode`
- 注解代码示例:
```java
/**
* PostCode 邮编注解
* area 地区编码:使用三位国际标准国家地区代码--ISO 3166-1
* @author src
* @Date 2020/7/12 10:01
* @version 1.0
*/
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface PostCode {
/** 校验失败提示语 **/
String msg() default "";
/** 属性中文名称 **/
String name() default "";
/** 地区编码:使用三位国际标准国家地区代码--ISO 3166-1 **/
String area() default "CHN";
}
```
- 实体类bean中使用注解,示例:
```java
@PostCode(msg = "邮政编码格式有误!",name = "邮编",area = "USA")
private String postCode;
```
---
> 版本号:Version 1.2.0
更新时间:2020-07-04
更新内容:
- 1.对原有代码结构进行优化,将校验结果、策略工厂封装到单例工厂类`BeanValidateSingletonFactory.java`中
- 2.删除原有注解工厂类方式相关代码,提取到`BeanValidatorFactory.java`中
- 3.具体工厂实施变更:
> 将原来的:`FailedList.faileList.add(msg);`替换为单例获取校验失败结果,
示例:`BeanValidateSingletonFactory.getInstance().addFaileList(msg);`
- 4.注解获取校验结果方式变更
- 示例:
```java
/**
*@Description 测试注解形式
* 排除不校验属性格式:
* name|...|age|
*
* 动态添加需要校验属性格式:
* name;ex;msg|...|age;ex;msg
*@Author stan
*@Date 2020-06-21 15:00
*@Param
*@return
*/
@BeanValidate(clazz = UserInfo.class,excludes = "userName",addPattern = "userName;\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*;改为邮箱格式!")
@RequestMapping("/ann")
public String annotation(UserInfo userInfo){
ValidateResult validateResult = BeanValidateSingletonFactory.getInstance().getValidateResult();
if(!validateResult.isResult()){
return JSONObject.toJSONString(validateResult);
}
return "注解校验器校验成功!";
}
```
---
> 版本号:Version 1.1.0
更新时间:2020-06-21
更新内容:
- 1.更新排除指定属性excludes类型
- 2.添加注解方式校验实体类Bean
> 版本号:Version 1.0
更新时间:2020-06-13
更新内容:第一个测试版本