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