1. 程式人生 > 實用技巧 >註解+反射實現實體屬性值為空驗證工具類

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

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

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("[email protected]");
        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;
    }
}