注解+反射實現實體屬性值為空驗證工具類


在接口開發時,最不喜歡的就是接口的入參的為空驗證,每個接口的參數都要寫比較麻煩,也容易漏掉一些字段,在此提供一份工具類,僅供參考。直接上代碼

1、自定義注解:

package com.jy.common;

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 CustomNull {
    String message() default "{參數不允許為空}";// 注解默認值
}

2、編寫父類(用於反射使用的泛型類):

package com.jy.po;

/**
 * 只用於實體類的父類,反射需要使用
 */
public class ReflectClazz {
}

3、編寫工具類(反射實現):

package com.jy.utils;

import com.jy.common.CustomNull;
import com.jy.po.ReflectClazz;

import java.lang.reflect.Field;
import java.util.List;
import java.util.Objects;

/**
 * 實體屬性值為空驗證
 */
public class CheckUtils {
    /**
     * 參數非空驗證[反射+自定義注解方式]
     * return:返回值為null--標識必填項都有值;不為null--返回為空的必填項
     */
    public static <T extends ReflectClazz> String checkListForNull(List<T> list) {
        try {
            for (T item : list) {
                StringBuffer sb = new StringBuffer();
                Class<? extends ReflectClazz> clazz = item.getClass();
                Field[] fields = clazz.getDeclaredFields();
                for (Field field : fields) {
                    if (field.isAnnotationPresent(CustomNull.class)) {
                        field.setAccessible(true);
                        String value = String.valueOf(field.get(item));
//                        System.out.println(field.getName()+"="+value);
                        if (StringUtil.isEmpty(value) || Objects.equals("null", value)) {
                            CustomNull CustomNullAnnotation = field.getAnnotation(CustomNull.class);
                            sb.append("【" + CustomNullAnnotation.message() + "】");
                        }
                    }
                }
                if (!StringUtil.isEmpty(sb.toString())) {
                    return sb.toString();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 參數非空驗證[反射+自定義注解方式]
     * return:返回值為null--標識必填項都有值;不為null--返回為空的必填項
     */
    public static <T extends ReflectClazz> String checkClassForNull(T obj) {
        StringBuffer sb = new StringBuffer();
        try {
            Field[] fields = obj.getClass().getDeclaredFields();
            for (Field field : fields) {
                field.setAccessible(true);
                String value = String.valueOf(field.get(obj));
//                System.out.println(field.getName() + "=" + value);
                if (StringUtil.isEmpty(value) || Objects.equals("null", value)) {
                    CustomNull CustomNullAnnotation = field.getAnnotation(CustomNull.class);
                    sb.append("【" + CustomNullAnnotation.message() + "】");
                }
                if (!StringUtil.isEmpty(sb.toString())) {
                    return sb.toString();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

}

4、定義測試實體類

package com.jy.po;

import com.jy.common.CustomNull;
import lombok.Data;

import java.util.List;

/**
 * 人員基本信息
 */
@Data
public class AgUserInfo extends ReflectClazz {
    /**主鍵id*/
    private Long id;

    /**人員姓名*/
    @CustomNull(message = "人員姓名不可為空")
    private String name;

    /**手機號*/
    @CustomNull(message = "手機號不可為空")
    private String mobile;

    /**身份證號碼*/
    @CustomNull(message = "身份證號碼不可為空")
    private String certificateNumber;

    /**人員執業范圍*/
    private List<AgUserAppraisalRange> userAppraisalrangeList;

    /**人員資質證書*/
    private List<AgUserAptitude> userAptitudeList;

}
package com.jy.vo;

import com.jy.common.CustomNull;
import com.jy.po.AgOrgInfo;
import com.jy.po.AgPowerInfo;
import com.jy.po.AgUserInfo;
import com.jy.po.ReflectClazz;
import lombok.Data;

import java.util.List;


/**
 * 組織信息
 */
@Data
public class OrgnizationVO extends ReflectClazz {

    /** 組織信息 */
    @CustomNull(message = "組織機構信息不可為空")
    private AgOrgInfo orgInfo;
    /** 資質信息 */
    @CustomNull(message = "資質信息不可為空")
    private List<AgPowerInfo> powerList;
    /** 人員信息 */
    @CustomNull(message = "人員信息不可為空")
    private List<AgUserInfo> userList;
    /**
     * 標識
     */
    @CustomNull(message = "標識不可為空")
    private String interfaceType;


}

5、編寫demo測試類

package com.jy.common;

import com.alibaba.fastjson.JSONObject;
import com.jy.constant.CommonConstant;
import com.jy.po.*;
import com.jy.utils.CheckUtils;
import com.jy.utils.DateTimeUtil;
import com.jy.utils.StringUtil;
import com.jy.vo.OrgnizationVO;

import javax.validation.Valid;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

/**
 * 接口測試
 */
public class DemoMain {

    public static void main(String[] args) {
        OrgnizationVO orgnizationVo = new OrgnizationVO();
//        AgOrgInfo orgInfo = initOrgInfo();
//        orgnizationVo.setOrgInfo(orgInfo);
//
//        List<AgPowerInfo> powerList = initPowerInfoList();
//        orgnizationVo.setPowerList(powerList);

        List<AgUserInfo> userList = initUerInfoList();
        orgnizationVo.setUserList(userList);
        // 集合對象為空驗證
//        System.out.println(CheckUtils.checkListForNull(userList));
        // 實體對象為空驗證
        System.out.println(CheckUtils.checkClassForNull(orgnizationVo));
        // 初始化機構參數
//        System.out.println(orgnizationParamsJson());
    }

    /** 新增機構-參數設計 */
    private static String orgnizationParamsJson() {
        OrgnizationVO orgnizationVo = new OrgnizationVO();
        AgOrgInfo orgInfo = initOrgInfo();
        orgnizationVo.setOrgInfo(orgInfo);

        List<AgPowerInfo> powerList = initPowerInfoList();
        orgnizationVo.setPowerList(powerList);

        List<AgUserInfo> userList = initUerInfoList();
        orgnizationVo.setUserList(userList);

        orgnizationVo.setInterfaceType(CommonConstant.INTERFACETYPE_ORGNIZATION);

        // 參數轉JSON字符串
        return JSONObject.toJSONString(orgnizationVo);
    }
    /** 新增機構-初始化-人員信息-集合 */
    private static List<AgUserInfo> initUerInfoList(){
        List<AgUserInfo> list = new ArrayList<>();
        AgUserInfo userInfo1 = new AgUserInfo();
        userInfo1.setName("setName人員1");
        userInfo1.setMobile("setMobile12311111111");
        userInfo1.setCertificateNumber("setCertificateNumber2374987239847923749827");

        List<AgUserAppraisalRange> userAppraisalRangeList1 = new ArrayList<>();
        AgUserAppraisalRange userAppraisalRange1 = new AgUserAppraisalRange();
        userAppraisalRange1.setAppraisalCategory("setAppraisalCategory人員鑒定類別1");
        userAppraisalRange1.setAppraisalItem("setAppraisalItem人員鑒定類型1");
        userAppraisalRange1.setAppraisalType("setAppraisalType人員鑒定項目1");
        userAppraisalRangeList1.add(userAppraisalRange1);
        userInfo1.setUserAppraisalrangeList(userAppraisalRangeList1);

        List<AgUserAptitude> userAptitudeList1 = new ArrayList<>();
        AgUserAptitude userAptitude1 = new AgUserAptitude();
        userAptitude1.setAptitudeUrl("setAptitudeUrl資質下載地址1");
        userAptitude1.setEffectiveStartDate("setEffectiveStartDate有效期開始時間1");
        userAptitude1.setEffectiveEndDate("setEffectiveEndDate有效期截止時間1");
        userAptitude1.setExecuteNo("setExecuteNo執業證號1");
        userAptitude1.setProfession("setProfession職稱1");
        userAptitudeList1.add(userAptitude1);

        userInfo1.setUserAptitudeList(userAptitudeList1);
        list.add(userInfo1);

        AgUserInfo userInfo2 = new AgUserInfo();
        userInfo2.setName("setName人員2");
        userInfo2.setMobile("setMobile12322222222");
        userInfo2.setCertificateNumber("setCertificateNumber2374987239847923749827");

        List<AgUserAppraisalRange> userAppraisalRangeList2 = new ArrayList<>();
        AgUserAppraisalRange userAppraisalRange2 = new AgUserAppraisalRange();
        userAppraisalRange2.setAppraisalCategory("setAppraisalCategory人員鑒定類別2");
        userAppraisalRange2.setAppraisalItem("setAppraisalItem人員鑒定類型2");
        userAppraisalRange2.setAppraisalType("setAppraisalType人員鑒定項目2");
        userAppraisalRangeList2.add(userAppraisalRange2);
        userInfo2.setUserAppraisalrangeList(userAppraisalRangeList2);

        List<AgUserAptitude> userAptitudeList2 = new ArrayList<>();
        AgUserAptitude userAptitude2 = new AgUserAptitude();
        userAptitude2.setAptitudeUrl("setAptitudeUrl資質下載地址2");
        userAptitude2.setEffectiveStartDate("setEffectiveStartDate有效期開始時間2");
        userAptitude2.setEffectiveEndDate("setEffectiveEndDate有效期截止時間2");
        userAptitude2.setExecuteNo("setExecuteNo執業證號2");
        userAptitude2.setProfession("setProfession職稱2");
        userAptitudeList2.add(userAptitude2);

        userInfo2.setUserAptitudeList(userAptitudeList2);

        list.add(userInfo2);

        return list;
    }
    /** 新增機構-初始化-資質信息-集合 */
    private static List<AgPowerInfo> initPowerInfoList(){
        List<AgPowerInfo> list = new ArrayList<>();
        AgPowerInfo powerInfo1 = new AgPowerInfo();
        powerInfo1.setName("setName資質1");
        powerInfo1.setDescription("setDescription描述1");
        powerInfo1.setClassify("setClassify1");
        powerInfo1.setImgPath("setImgPathhttp://file/img/aaaa.png");
        powerInfo1.setEffectiveStartDate("setEffectiveStartDate"+LocalDate.now());
        powerInfo1.setEffectiveEndDate("setNasetEffectiveEndDateme"+LocalDate.now());
        powerInfo1.setAptitudeGrade("setAptitudeGrade一級分類1");
        powerInfo1.setAptitudeLevel("setAptitudeLevel二級分類1");
        powerInfo1.setAptitudeRange("setAptitudeRange三級分類1");
        powerInfo1.setRemark("setRemark備注1");
        list.add(powerInfo1);

        AgPowerInfo powerInfo2 = new AgPowerInfo();
        powerInfo2.setName("setName資質2");
        powerInfo2.setDescription("setDescription描述2");
        powerInfo2.setClassify("setClassify2");
        powerInfo2.setImgPath("setImgPathhttp://file/img/aaaa.png");
        powerInfo2.setEffectiveStartDate("setEffectiveStartDate"+LocalDate.now());
        powerInfo2.setEffectiveEndDate("setNasetEffectiveEndDateme"+LocalDate.now());
        powerInfo2.setAptitudeGrade("setAptitudeGrade一級分類2");
        powerInfo2.setAptitudeLevel("setAptitudeLevel二級分類2");
        powerInfo2.setAptitudeRange("setAptitudeRange三級分類2");
        powerInfo2.setRemark("setRemark備注2");
        list.add(powerInfo2);

        return list;
    }
    /** 新增機構-初始化-機構信息 */
    private static AgOrgInfo initOrgInfo() {
        AgOrgInfo orgInfo = new AgOrgInfo();
        orgInfo.setOrgId("setOrgId11111111111");
        orgInfo.setOrgName("setOrgName機構1");
        orgInfo.setOrgCode("setOrgCode2937492ksjjfssj87");
        orgInfo.setRegionCode("setRegionCode0012003");
        orgInfo.setLicence("setLicence23423423");
        orgInfo.setLegalPerson("setLegalPerson張三");
        orgInfo.setPersonLiable("setPersonLiable李四");
        orgInfo.setFax("setFax4525452423");
        orgInfo.setEmail("setEmail2423@163.com");
        orgInfo.setRange("setRange涼快聖誕節是");
        orgInfo.setBankAccount("setBankAccount中國銀行");
        orgInfo.setAccountName("setAccountName公司賬戶");
        orgInfo.setAccountNumber("setAccountNumber928748278279847289742");
        orgInfo.setOrgPhone("setOrgPhone13679797979");
        orgInfo.setAverageGrade("setAverageGrade123");
        orgInfo.setEstablishDate("setEstablishDate"+ LocalDate.now());
        orgInfo.setBusinessAcreage("setBusinessAcreage300");
        orgInfo.setOrgAppraisalCategory("setOrgAppraisalCategory方式");
        orgInfo.setOrgAppraisalType("setOrgAppraisalTypetypeA,typeB,typeC");
        orgInfo.setOrgAppraisalItem("setOrgAppraisalItemitemA,itemB,itemC");
        orgInfo.setCreditEvaluate("setCreditEvaluate優秀");
        orgInfo.setSparePhone("setSparePhone13111111111");
        return orgInfo;
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM