使用场景:
保存对象之前都要进行参数校验,例如非空校验,长度校验等,一个个字段来校验的话非常繁琐,使用注解可以灵活的进行参数校验。
直接上代码了
/** * 用于校验前端传输的参数为非空 * Created by star on 2017/5/8. */ @Target({ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) public @interface ParamNotNull { }
/** * 对非空参数进行校验,使用注解 * @param model javabean 对象 * @throws ClassNotFoundException */ public static CheckResult parameterIsNotNull(Object model) { try { Field[] fields = model.getClass().getDeclaredFields(); boolean flag = true; String fieldstr = "字段:"; for (Field field : fields) { ParamNotNull annotation = field.getAnnotation(ParamNotNull.class); if(annotation != null){ String name = field.getName(); if(!chechFiled(model,name,field)){ flag = false; fieldstr = fieldstr + name + " "; } } } if(flag){//校验通过 return new CheckResult(true); }else {//有参数校验不通过 return new CheckResult(ApiResponse.error(Syscode.PARAMETER_ERROR,fieldstr+"不能为空!")); } }catch (Exception e){ LOG.error(CheckParameter.class,"对非空参数进行校验时异常 e: " + e.getMessage()); return new CheckResult(ApiResponse.error(Syscode.SYSTEM_EXCEPTION)); } } private static boolean chechFiled(Object model,String name,Field field) throws Exception{ boolean flag = true; name = name.substring(0,1).toUpperCase()+name.substring(1); //将属性的首字符大写,方便构造get,set方法 String type = field.getGenericType().toString(); //获取属性的类型 if(type.equals("class java.lang.String")){ //如果type是类类型,则前面包含"class ",后面跟类名 Method m = model.getClass().getMethod("get"+name); String value = (String) m.invoke(model); //调用getter方法获取属性值 if(StringUtils.isBlank(value)){ flag = false; } }else { Method m = model.getClass().getMethod("get"+name); Object value = m.invoke(model); if(value == null){ flag = false; } } return flag; }
或者只使用反射机制
/** * 对非空参数进行校验 * @param model javabean 对象 * @param unCheckField 不校验的字段 * @return */ public static CheckResult parameterIsNotNull(Object model, Set<String> unCheckField){ try { boolean flag = true; String fieldstr = "字段:"; Field[] field = model.getClass().getDeclaredFields(); //获取实体类的所有属性,返回Field数组 for(int j=0 ; j<field.length ; j++){ //遍历所有属性 String name = field[j].getName(); //获取属性的名字 if(unCheckField.contains(name)){ continue;//不需要校验此字段 } if(!chechFiled(model,name,field[j])){ flag = false; fieldstr = fieldstr + name + " "; } } if(flag){//校验通过 return new CheckResult(true); }else {//有参数校验不通过 return new CheckResult(ApiResponse.error(Syscode.PARAMETER_ERROR,fieldstr+"不能为空!")); } }catch (Exception e){ LOG.error(CheckParameter.class,"对非空参数进行校验时异常 e: " + e.getMessage()); return new CheckResult(ApiResponse.error(Syscode.SYSTEM_EXCEPTION)); } }
写在最后:后来了解到spring也是有校验参数注解。。。。。。思路是一样的。所以说需要多读书,这样就不需要自己写那么多了。 不过呢自己写的好处是可以根据业务灵活变通.