对于前端穿过来的值要做验证处理,但市面上已经存在很多验证框架了。这里作为自己实现得思路和整理,有需要特别验证得可以自己实现自己想要得。
实现一个工具类
/**
* @author shezuoqiang
* @date 2022年10月20日 16:15
*/
public class ValidateUtil {
/**
* 验证工具类
* @param nameKey 需要抛出错误的中文信息
* @param value 需要验证的值
* @param vis 验证条件
* @return
*/
public static void valid(String nameKey, Object value, ValidateItem... vis){
for(ValidateItem valid:vis){
ValidateItem.ValidType vt=valid.valid(value);
if(vt!=null){
if(vt==ValidateItem.ValidType.range){
String[] params=valid.getParameter().split("-");
throw new ValidateException(nameKey, ValidateItem.ValidType.range.toString(),params);
}
else if(vt==ValidateItem.ValidType.notnull){
throw new ValidateException(nameKey, ValidateItem.ValidType.notnull.toString(),null);
}
else if(vt==ValidateItem.ValidType.date){
throw new ValidateException(nameKey, ValidateItem.ValidType.date.toString(),null);
}
else {
throw new ValidateException(nameKey, ValidateItem.ValidType.reg.toString(),null);
}
}
}
}
}
ValidateItem 实现
import org.apache.commons.lang3.StringUtils;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* @author shezuoqiang
* @date 2022年10月20日 17:17
*/
public class ValidateItem {
public enum ValidType {
notnull, //非空验证
range, //区间
reg, //正则
email, //邮箱
mobile, //手机
date //日期
};
public enum DataType{
string, //字符串
num, //整数
date //日期
};
/**
* 验证类型
*/
private ValidType validType;
/**
* 数据类型
*/
private DataType dataType;
/**
* 验证参数
* notnull时,此值为空
* range时,此值为最大最小范围如 10-20
* reg时,此值为正则表达式
*/
private String parameter;
public ValidateItem(ValidType vt){
validType=vt;
}
public ValidateItem(ValidType vt,String parameter){
validType=vt;
this.parameter=parameter;
}
public String getParameter() {
return parameter;
}
public void setParameter(String parameter) {
this.parameter = parameter;
}
/**
* 查找数据类型
* @param value
*/
private DataType findDataType(Object value){
if(value instanceof Number){
dataType=DataType.num;
}
else if(value instanceof Date){
dataType=DataType.date;
}
else if(value instanceof String){
dataType=DataType.string;
}
return dataType;
}
private boolean validDate(Object value){
String date=(String)value;
try{
SimpleDateFormat sdf=new SimpleDateFormat(parameter);
sdf.parse(date);
}catch(Exception e){
return false;
}
return true;
}
private boolean validNull(Object value){
if(value==null){
return false;
}
else if(dataType==DataType.string){
String str=(String)value;
if(StringUtils.isBlank(str))
return false;
}
return true;
}
private boolean validRange(Object value){
String[] params=parameter.split("-");
if(dataType==DataType.num){
Number num=(Number)value;
if(num.longValue()<Long.parseLong(params[0])){
return false;
}
else if(num.longValue()>Long.parseLong(params[1])){
return false;
}
}
else if(dataType==DataType.string){
String str=(String)value;
if(StringUtils.isNotBlank(str)&&str.length()<Long.parseLong(params[0])){
return false;
}
else if(StringUtils.isNotBlank(str)&&str.length()>Long.parseLong(params[1])){
return false;
}
}
return true;
}
private boolean validReg(Object value){
if(dataType==DataType.string){
String str=(String)value;
if(StringUtils.isNotBlank(str)&&!str.matches(parameter))
return false;
}
return true;
}
private boolean validEmail(Object value){
if(dataType==DataType.string){
String str=(String)value;
if(StringUtils.isNotBlank(str)&&!str.matches(RegulareExpUtils.EMAIL_REG))
return false;
}
return true;
}
private boolean validMobile(Object value){
if(dataType==DataType.string){
String str=(String)value;
if(StringUtils.isNotBlank(str)&&!str.matches(RegulareExpUtils.MOBILE_REG))
return false;
}
return true;
}
/**
* 验证数据
* @param value
* @return
*/
public ValidType valid(Object value){
findDataType(value);
if(validType==ValidType.notnull&&!validNull(value)){
return ValidType.notnull;
}
else if(validType==ValidType.range&&!validRange(value)){
return ValidType.range;
}
else if(validType==ValidType.reg&&!validReg(value)){
return ValidType.reg;
}
else if(validType==ValidType.email&&!validEmail(value)){
return ValidType.reg;
}
else if(validType==ValidType.mobile&&!validMobile(value)){
return ValidType.reg;
}
else if(validType==ValidType.date&&!validDate(value)){
return ValidType.date;
}
return null;
}
}
直接在ValidateItem 中的枚举中 写出自己想要的判断类型 在 valid 判断响应类型获取相应的实现即可
main方法调用
public static void main(String[] args) {
ValidateUtil.valid("月度个人完成率必须数字;","10"
,new ValidateItem(ValidateItem.ValidType.notnull)
,new ValidateItem(ValidateItem.ValidType.reg,"[+-]?[0-9]+(\\.[0-9]{1,4})?")
);
}
想多个验证就在后面多new几个验证方法。