# 实体类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 更新内容:第一个测试版本