在项目开发过程中,经常会遇见对实体类中的属性字段进行判空校验。在实际过程中有多种方法进行实现,下面通过代码+注解的形式实现这一需求。这样实现的好处是,可将此方法抽出,在外部访问接口前,就进行判断,不必进入接口代码里面。 下面列举具体代码:
1、 首先有实体类,实体类中字段属性加入注解:
pulic class Demo{
@ParamValid(type = ParamValidType.EMPTY)
private String name;
@ParamValid(type = ParamValidType.EMPTY)
private String className; //有注解,有type类型,则进行字段为空校验 = 即className字段不能为空。
@ParamValid()
private int age; //有注解,无type类型,则不进行字段为空校验 = 即age字段不通过注解校验该字段为空
@ParamValid(type = ParamValidType.EMPTY)
private String idCard;
......
}
2、JAVA代码进行注解生效编写方法。
/**
* 针对对象中有@ParamValid注解的字段进行校验。
* @param dest 需要检查的字段对象
*/
public void checkNull(Object dest){
/* 获取对象所有字段*/
Field[] declaredFields = dest.getClass().getDeclaredFields();
//获取字段值Map
Map<String,Object> destMap = BeanUtils.bean2Map(dest);
Map<String,Object> map = new HashMap<>;
if (null != destMap){
map = destMap;
}
/* 对每个字段进行校验*/
for(Field fidle : declaredFields ){
if(fidle.isAnnotationPresent(ParamValid.Class)){
//方法
validParam(fidle.getAnnotation(ParamValid.Class).sourcekey(),map.get(fidle.getName)),
fidle.getAnnotation(ParamValid.Class));
}
}
}
/**
* 字段校验
* @param sourceKey 检测字段
* @param obj 检测值
* @param paramValid 检测注解
*
/
private void validParam(String sourceKey ,Object obj , ParamValid paramValid){
if(!ParamValidType.NULL.equals(paramValid.type())){
String[] params = new String[1];
params[0] = sourceKey ;
/* 非空检验 */
if (ParamValidType.EMPTY.equals(pavamValid.type()) && Util.isNullorEmpty(obj)){
logger.error("非空校验,exception1 校验类型 type :{} ,校验字段:{} ,校验字段的值:{}",paramValid.type().getValue(),sourceKey ,obj);
throw new ValidateException("999999",params);
}
/* 格式校验*/
if(!ParamValidType.EMPTY.equals(pavamValid.type()) && Util.isNullorEmpty(obj)
&& !ValidatorUtils.validatorFactory(paramValid.type().getKey(),String.valueOf(obj)) ){
logger.error("非空校验,exception2 校验类型 type :{} ,校验字段:{} ,校验字段的值:{}",paramValid.type().getKey(),sourceKey ,obj);
throw new ValidateException("999999",params);
}
}
}
}
谢谢!