parent
c7ae78342f
commit
50c9da1eed
@ -0,0 +1,330 @@
|
||||
package org.opsli.api.utils;
|
||||
|
||||
import cn.hutool.core.lang.Validator;
|
||||
import cn.hutool.core.util.ReflectUtil;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.opsli.api.msg.ValidationMsg;
|
||||
import org.opsli.api.wrapper.system.dict.SysDictModel;
|
||||
import org.opsli.common.annotation.validation.ValidationArgs;
|
||||
import org.opsli.common.annotation.validation.ValidationArgsMax;
|
||||
import org.opsli.common.annotation.validation.ValidationArgsMin;
|
||||
import org.opsli.common.enums.ValiArgsType;
|
||||
import org.opsli.common.exception.ServiceException;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
|
||||
/**
|
||||
* @BelongsProject: opsli-boot
|
||||
* @BelongsPackage: org.opsli.common.utils
|
||||
* @Author: Parker
|
||||
* @CreateTime: 2020-09-22 17:29
|
||||
* @Description: 验证器工具类
|
||||
*/
|
||||
@Slf4j
|
||||
public final class ValidationUtil {
|
||||
|
||||
/** 编码格式 */
|
||||
private static final String CHARSET_NAME = "utf-8";
|
||||
|
||||
/**
|
||||
* 验证对象
|
||||
* @param obj
|
||||
*/
|
||||
public static void verify(Object obj){
|
||||
if(obj == null){
|
||||
return;
|
||||
}
|
||||
|
||||
Field[] fields = ReflectUtil.getFields(obj.getClass());
|
||||
for (int i = 0; i < fields.length; i++) {
|
||||
Field field = fields[i];
|
||||
// 获得 统一验证 注解
|
||||
ValidationArgs validationArgs = field.getAnnotation(ValidationArgs.class);
|
||||
if(validationArgs != null){
|
||||
ValiArgsType[] types = validationArgs.value();
|
||||
Object fieldValue = ReflectUtil.getFieldValue(obj, field);
|
||||
ValidationUtil.check(field, types, fieldValue);
|
||||
}
|
||||
|
||||
// 获得 最大长度 注解
|
||||
ValidationArgsMax validationArgsMax = field.getAnnotation(ValidationArgsMax.class);
|
||||
if(validationArgsMax != null){
|
||||
int maxLength = validationArgsMax.value();
|
||||
Object fieldValue = ReflectUtil.getFieldValue(obj, field);
|
||||
ValidationUtil.checkMax(field, maxLength, fieldValue);
|
||||
}
|
||||
|
||||
// 获得 最小长度 注解
|
||||
ValidationArgsMin validationArgsMin = field.getAnnotation(ValidationArgsMin.class);
|
||||
if(validationArgsMin != null){
|
||||
int minLength = validationArgsMin.value();
|
||||
Object fieldValue = ReflectUtil.getFieldValue(obj, field);
|
||||
ValidationUtil.checkMin(field, minLength, fieldValue);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 通用校验
|
||||
* @param field
|
||||
* @param types
|
||||
* @param fieldValue
|
||||
*/
|
||||
private static void check(Field field, ValiArgsType[] types, Object fieldValue){
|
||||
// 获得字段名
|
||||
String fieldName = field.getName();
|
||||
ApiModelProperty annotation = field.getAnnotation(ApiModelProperty.class);
|
||||
if(annotation != null){
|
||||
fieldName = annotation.value();
|
||||
}
|
||||
|
||||
// 循环验证
|
||||
for (ValiArgsType type : types) {
|
||||
try {
|
||||
switch (type) {
|
||||
// 不能为空
|
||||
case IS_NOT_NULL:
|
||||
boolean notNull = Validator.isNotEmpty(fieldValue);
|
||||
if(!notNull){
|
||||
ValidationMsg msg = ValidationMsg.EXCEPTION_IS_NOT_NULL;
|
||||
msg.setFieldName(fieldName);
|
||||
throw new ServiceException(msg);
|
||||
}
|
||||
break;
|
||||
// 字母,数字和下划线
|
||||
case IS_GENERAL:
|
||||
boolean general = Validator.isGeneral(String.valueOf(fieldValue));
|
||||
if(!general){
|
||||
ValidationMsg msg = ValidationMsg.EXCEPTION_IS_GENERAL;
|
||||
msg.setFieldName(fieldName);
|
||||
throw new ServiceException(msg);
|
||||
}
|
||||
break;
|
||||
// 数字
|
||||
case IS_NUMBER:
|
||||
boolean number = Validator.isNumber(String.valueOf(fieldValue));
|
||||
if(!number){
|
||||
ValidationMsg msg = ValidationMsg.EXCEPTION_IS_NUMBER;
|
||||
msg.setFieldName(fieldName);
|
||||
throw new ServiceException(msg);
|
||||
}
|
||||
break;
|
||||
// 纯字母
|
||||
case IS_LETTER:
|
||||
boolean letter = Validator.isLetter(String.valueOf(fieldValue));
|
||||
if(!letter){
|
||||
ValidationMsg msg = ValidationMsg.EXCEPTION_IS_LETTER;
|
||||
msg.setFieldName(fieldName);
|
||||
throw new ServiceException(msg);
|
||||
}
|
||||
break;
|
||||
// 大写
|
||||
case IS_UPPER_CASE:
|
||||
boolean upperCase = Validator.isUpperCase(String.valueOf(fieldValue));
|
||||
if(!upperCase){
|
||||
ValidationMsg msg = ValidationMsg.EXCEPTION_IS_UPPER_CASE;
|
||||
msg.setFieldName(fieldName);
|
||||
throw new ServiceException(msg);
|
||||
}
|
||||
break;
|
||||
// 小写
|
||||
case IS_LOWER_CASE:
|
||||
boolean lowerCase = Validator.isLowerCase(String.valueOf(fieldValue));
|
||||
if(!lowerCase){
|
||||
ValidationMsg msg = ValidationMsg.EXCEPTION_IS_LOWER_CASE;
|
||||
msg.setFieldName(fieldName);
|
||||
throw new ServiceException(msg);
|
||||
}
|
||||
break;
|
||||
// IPV4
|
||||
case IS_IPV4:
|
||||
boolean ipv4 = Validator.isIpv4(String.valueOf(fieldValue));
|
||||
if(!ipv4){
|
||||
ValidationMsg msg = ValidationMsg.EXCEPTION_IS_IPV4;
|
||||
msg.setFieldName(fieldName);
|
||||
throw new ServiceException(msg);
|
||||
}
|
||||
break;
|
||||
// 金额
|
||||
case IS_MONEY:
|
||||
boolean money = Validator.isMoney(String.valueOf(fieldValue));
|
||||
if(!money){
|
||||
ValidationMsg msg = ValidationMsg.EXCEPTION_IS_MONEY;
|
||||
msg.setFieldName(fieldName);
|
||||
throw new ServiceException(msg);
|
||||
}
|
||||
break;
|
||||
// 邮箱
|
||||
case IS_EMAIL:
|
||||
boolean email = Validator.isEmail(String.valueOf(fieldValue));
|
||||
if(!email){
|
||||
ValidationMsg msg = ValidationMsg.EXCEPTION_IS_EMAIL;
|
||||
msg.setFieldName(fieldName);
|
||||
throw new ServiceException(msg);
|
||||
}
|
||||
break;
|
||||
// 手机号
|
||||
case IS_MOBILE:
|
||||
boolean mobile = Validator.isMobile(String.valueOf(fieldValue));
|
||||
if(!mobile){
|
||||
ValidationMsg msg = ValidationMsg.EXCEPTION_IS_MOBILE;
|
||||
msg.setFieldName(fieldName);
|
||||
throw new ServiceException(msg);
|
||||
}
|
||||
break;
|
||||
// 18位身份证
|
||||
case IS_CITIZENID:
|
||||
boolean citizenId = Validator.isCitizenId(String.valueOf(fieldValue));
|
||||
if(!citizenId){
|
||||
ValidationMsg msg = ValidationMsg.EXCEPTION_IS_CITIZENID;
|
||||
msg.setFieldName(fieldName);
|
||||
throw new ServiceException(msg);
|
||||
}
|
||||
break;
|
||||
// 邮编
|
||||
case IS_ZIPCODE:
|
||||
boolean zipCode = Validator.isZipCode(String.valueOf(fieldValue));
|
||||
if(!zipCode){
|
||||
ValidationMsg msg = ValidationMsg.EXCEPTION_IS_ZIPCODE;
|
||||
msg.setFieldName(fieldName);
|
||||
throw new ServiceException(msg);
|
||||
}
|
||||
break;
|
||||
// URL
|
||||
case IS_URL:
|
||||
boolean url = Validator.isUrl(String.valueOf(fieldValue));
|
||||
if(!url){
|
||||
ValidationMsg msg = ValidationMsg.EXCEPTION_IS_URL;
|
||||
msg.setFieldName(fieldName);
|
||||
throw new ServiceException(msg);
|
||||
}
|
||||
break;
|
||||
// 汉字
|
||||
case IS_CHINESE:
|
||||
boolean chinese = Validator.isChinese(String.valueOf(fieldValue));
|
||||
if(!chinese){
|
||||
ValidationMsg msg = ValidationMsg.EXCEPTION_IS_CHINESE;
|
||||
msg.setFieldName(fieldName);
|
||||
throw new ServiceException(msg);
|
||||
}
|
||||
break;
|
||||
// 汉字,字母,数字和下划线
|
||||
case IS_GENERAL_WITH_CHINESE:
|
||||
boolean generalWithChinese = Validator.isGeneralWithChinese(String.valueOf(fieldValue));
|
||||
if(!generalWithChinese){
|
||||
ValidationMsg msg = ValidationMsg.EXCEPTION_IS_GENERAL_WITH_CHINESE;
|
||||
msg.setFieldName(fieldName);
|
||||
throw new ServiceException(msg);
|
||||
}
|
||||
break;
|
||||
// MAC地址
|
||||
case IS_MAC:
|
||||
boolean mac = Validator.isMac(String.valueOf(fieldValue));
|
||||
if(!mac){
|
||||
ValidationMsg msg = ValidationMsg.EXCEPTION_IS_MAC;
|
||||
msg.setFieldName(fieldName);
|
||||
throw new ServiceException(msg);
|
||||
}
|
||||
break;
|
||||
// 中国车牌
|
||||
case IS_PLATE_NUMBER:
|
||||
boolean plateNumber = Validator.isPlateNumber(String.valueOf(fieldValue));
|
||||
if(!plateNumber){
|
||||
ValidationMsg msg = ValidationMsg.EXCEPTION_IS_PLATE_NUMBER;
|
||||
msg.setFieldName(fieldName);
|
||||
throw new ServiceException(msg);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}catch (ServiceException e){
|
||||
throw e;
|
||||
}catch (Exception e){
|
||||
log.error(e.getMessage(),e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 最大长度校验
|
||||
* @param field
|
||||
* @param maxLength
|
||||
* @param fieldValue
|
||||
*/
|
||||
private static void checkMax(Field field, int maxLength, Object fieldValue){
|
||||
// 获得字段名
|
||||
String fieldName = field.getName();
|
||||
ApiModelProperty annotation = field.getAnnotation(ApiModelProperty.class);
|
||||
if(annotation != null){
|
||||
fieldName = annotation.value();
|
||||
}
|
||||
|
||||
// 循环验证
|
||||
try {
|
||||
String value = String.valueOf(fieldValue);
|
||||
if(value != null){
|
||||
// 转换为 数据库真实 长度
|
||||
int strLength = value.getBytes(CHARSET_NAME).length;
|
||||
if(strLength > maxLength){
|
||||
ValidationMsg msg = ValidationMsg.EXCEPTION_IS_MAX;
|
||||
msg.setFieldName(fieldName);
|
||||
throw new ServiceException(msg);
|
||||
}
|
||||
}
|
||||
}catch (ServiceException e){
|
||||
throw e;
|
||||
}catch (Exception e){
|
||||
log.error(e.getMessage(),e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 最小长度校验
|
||||
* @param field
|
||||
* @param minLength
|
||||
* @param fieldValue
|
||||
*/
|
||||
private static void checkMin(Field field, int minLength, Object fieldValue){
|
||||
// 获得字段名
|
||||
String fieldName = field.getName();
|
||||
ApiModelProperty annotation = field.getAnnotation(ApiModelProperty.class);
|
||||
if(annotation != null){
|
||||
fieldName = annotation.value();
|
||||
}
|
||||
|
||||
// 循环验证
|
||||
try {
|
||||
String value = String.valueOf(fieldValue);
|
||||
if(value != null){
|
||||
// 转换为 数据库真实 长度
|
||||
int strLength = value.getBytes(CHARSET_NAME).length;
|
||||
if(strLength < minLength){
|
||||
ValidationMsg msg = ValidationMsg.EXCEPTION_IS_MIN;
|
||||
msg.setFieldName(fieldName);
|
||||
throw new ServiceException(msg);
|
||||
}
|
||||
}
|
||||
}catch (ServiceException e){
|
||||
throw e;
|
||||
}catch (Exception e){
|
||||
log.error(e.getMessage(),e);
|
||||
}
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
SysDictModel sysDictModel = new SysDictModel();
|
||||
sysDictModel.setTypeCode("asdsa");
|
||||
sysDictModel.setTypeName("阿哈哈哈哈");
|
||||
sysDictModel.setRemark("测试11232131231231223123");
|
||||
sysDictModel.setIzLock('1');
|
||||
|
||||
ValidationUtil.verify(sysDictModel);
|
||||
}
|
||||
|
||||
|
||||
// ================
|
||||
private ValidationUtil(){}
|
||||
}
|
@ -0,0 +1,21 @@
|
||||
package org.opsli.common.annotation.validation;
|
||||
|
||||
import org.opsli.common.enums.ValiArgsType;
|
||||
|
||||
import java.lang.annotation.*;
|
||||
|
||||
/**
|
||||
* @BelongsProject: opsli-boot
|
||||
* @BelongsPackage: org.opsli.common.annotation
|
||||
* @Author: Parker
|
||||
* @CreateTime: 2020-09-22 17:07
|
||||
* @Description: 字段验证器
|
||||
*/
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Target(ElementType.FIELD)
|
||||
@Documented
|
||||
public @interface ValidationArgs {
|
||||
|
||||
ValiArgsType[] value();
|
||||
|
||||
}
|
@ -0,0 +1,23 @@
|
||||
package org.opsli.common.annotation.validation;
|
||||
|
||||
|
||||
import java.lang.annotation.*;
|
||||
|
||||
/**
|
||||
* @BelongsProject: opsli-boot
|
||||
* @BelongsPackage: org.opsli.common.annotation
|
||||
* @Author: Parker
|
||||
* @CreateTime: 2020-09-22 17:07
|
||||
* @Description: 字段验证器 - 字段最大长度
|
||||
*
|
||||
* 对应 数据库 真实长度数
|
||||
*
|
||||
*/
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Target(ElementType.FIELD)
|
||||
@Documented
|
||||
public @interface ValidationArgsMax {
|
||||
|
||||
int value();
|
||||
|
||||
}
|
@ -0,0 +1,23 @@
|
||||
package org.opsli.common.annotation.validation;
|
||||
|
||||
|
||||
import java.lang.annotation.*;
|
||||
|
||||
/**
|
||||
* @BelongsProject: opsli-boot
|
||||
* @BelongsPackage: org.opsli.common.annotation
|
||||
* @Author: Parker
|
||||
* @CreateTime: 2020-09-22 17:07
|
||||
* @Description: 字段验证器 - 字段最大长度
|
||||
*
|
||||
* 对应 数据库 真实长度数
|
||||
*
|
||||
*/
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Target(ElementType.FIELD)
|
||||
@Documented
|
||||
public @interface ValidationArgsMin {
|
||||
|
||||
int value();
|
||||
|
||||
}
|
Loading…
Reference in new issue