zoukankan      html  css  js  c++  java
  • 对前台传过来的实体是否为空 进行为空校验的N种方法

    首先定义一个注解,如下

    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    @Target({ElementType.FIELD})
    @Retention(RetentionPolicy.RUNTIME)
    public @interface ParamNotNull {
    }
    

      

    简单解释一下,interface前面加@的意思是:

    @interface 不是interface,是注解类
    是jdk1.5之后加入的,java没有给它新的关键字,所以就用@interface 这么个东西表示了
    这个注解类,就是定义一个可用的注解,包括这个注解用于什么地方,是类,还是方法,还是property,还是方法入参等等,还有这个注解是否编译后进入class
    比如我们知道的用于javadoc的注解,是不进入class文件的。然后在后面你就可以用这个注解写代码了。
    总的来说,这就是一个生成javadoc时用到的注释类



    /**
    * 对非空参数进行校验,使用注解
    * @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);
    }

  • 相关阅读:
    建筑经济与企业管理 【1090】
    31 任意进制计数器的构成方法1
    30 同步计数器
    29 典型的时序电路模块2
    STM32的FSMC详解
    28 典型的时序电路模块1
    27 FSM,时序电路的分析方法
    26 电路结构和逻辑功能的关系
    25 触发器逻辑功能的分类
    24 触发器的电路结构和动作特点
  • 原文地址:https://www.cnblogs.com/qianjinyan/p/10367612.html
Copyright © 2011-2022 走看看