使用场景:
保存对象之前都要进行参数校验,例如非空校验,长度校验等,一个个字段来校验的话非常繁琐,使用注解可以灵活的进行参数校验。
/** * 用于校验前端传输的参数为非空 * 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)); } }
import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; import org.apache.commons.lang.StringUtils; import com.yucheng.cmis.channel.stagedaccess.domain.MapsStagedMaintainInfo; /** * 校验参数是否为空 * @author xr * @param model:参数所在的实体类 paramList:要校验的参数 * */ public class ParamCheck { public static boolean isNotBlank(Object model,List<String> paramList) throws Exception, Exception { boolean flag = true; String params = ""; String param = ""; for(int i=0;i<paramList.size();i++) { params = paramList.get(i); if (params.indexOf("_") < 0) { params = params.substring(0,1).toUpperCase()+params.substring(1); //将属性的首字符大写,方便构造get,set方法 System.out.println(params); Method m = model.getClass().getMethod("get"+params); String value = (String) m.invoke(model); //调用getter方法获取属性值 if(StringUtils.isBlank(value)){ flag = false; return flag; } } else { String[] strs = params.split("_"); for (int j=0;j<strs.length;j++) { params = strs[j].substring(0,1).toUpperCase()+strs[j].substring(1); //将属性的首字符大写,方便构造get,set方法 param += params; System.out.println(param); } Method m = model.getClass().getMethod("get"+param); String value = (String) m.invoke(model); //调用getter方法获取属性值 if(StringUtils.isBlank(value)){ flag = false; return flag; } } } return flag; } public static void main(String[] args) throws Exception { //维护人员信息 MapsStagedMaintainInfo mainInfo = new MapsStagedMaintainInfo(); //mainInfo.setHead("aa"); mainInfo.setBusiManagerStore("bbb"); List<String> paramList = new ArrayList<String>(); paramList.add("head"); paramList.add("busi_manager_store"); boolean result = ParamCheck.isNotBlank(mainInfo, paramList); System.out.println(result); } }