判斷Bean對象指定字段非空匿情。
方案:
在bean對象上增加注解,指定字段非空信殊,返回異常信息有明確字段描述炬称,省去不必要的if、else判斷涡拘。
新建注解類
/**
* 參數(shù)校驗(yàn)玲躯,判斷字段非空、返回異常文字(國際化)
**/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ParamsAnn {
/**
* 主鍵標(biāo)識
*/
boolean primaryKey() default false;
/**
* 不為空屬性
*/
boolean isNotNull() default true;
/**
* 字段描述名鳄乏,可以是中文跷车、英文,可以配置在緩存里面
*/
String colName() default "";
}
BeanHelper工具類橱野,實(shí)現(xiàn)非空判斷和拋異常
public class BeanHelper {
/**
*
* @Function: com.ai.ruleframe.tools.BeanHelper::validate
* @Description: 根據(jù)xxBean對象的字段注解朽缴,判斷非空并且返回相應(yīng)的描述(需要支持中英文多語言)
* @param t
* Bean對象
* @return
* @throws Exception
* @version: v1.1.0
* @author: rule_team
* @date: 2019年6月15日 上午10:48:53
*/
public static <T> boolean validate(T t) throws Exception {
// 獲取Bean對象中的字段枚舉
Field[] fields = t.getClass().getDeclaredFields();
for (Field field : fields) {
// ParamsAnn類型的注解是否在field類上。
if (field.isAnnotationPresent(ParamsAnn.class)) {
ParamsAnn paramsAnn = field.getAnnotation(ParamsAnn.class);
// 主鍵不校驗(yàn)非空水援,DAO層會自動補(bǔ)充完整
if (paramsAnn.primaryKey()) {
continue;
}
String colName = field.getName().split("_")[1];// 字段名密强,首字母大寫形式,從xxBean中獲取蜗元。
if (paramsAnn.isNotNull()) {
Boolean result = true;
Method m = t.getClass().getMethod("get" + colName);
// 如果類型是String
if ("class java.lang.String".equals(m.getGenericReturnType().toString())) { // 如果type是類類型或渤,則前面包含"class ",后面跟類名
// 拿到該屬性的get方法
String val = String.valueOf(m.invoke(t));// 調(diào)用getter方法獲取屬性值
if (StringUtils.isEmpty(val) || "null".equalsIgnoreCase(val)) {
result = false;
}
} else if ("long".equals(m.getGenericReturnType().toString())) {
// 如果是long是類型许帐,需要看不能小于注解說明的最小值
Long val = (Long) m.invoke(t);// 調(diào)用getter方法獲取屬性值
if (val <= paramsAnn.minValue()) {
result = false;
}
} else if ("class java.lang.Integer".equals(m.getGenericReturnType().toString())) { // 如果type是類類型劳坑,則前面包含"class ",后面跟類名
Integer val = (Integer) m.invoke(t);// 調(diào)用getter方法獲取屬性值
if (val < 0) {
result = false;
}
}
// 校驗(yàn)失敗成畦,統(tǒng)一拋出異常
if (!result) {
String colNameDesc = CrmLocaleFactory.getResource(paramsAnn.colName());// 字段名描述距芬,采用國際化方式
// RFS0000017 = {0}[{1}]字段不能為空涝开! -- 例如:SIM卡號[ICC_ID]不能為空关拒!
ExceptionUtil.throwBusinessException("RFS0000017", colNameDesc, colName);// 國際化翻譯方法
}
}
}
}
return true;
}
}
JavaBean對象示例
public class BORfKnowledgeBaseBean extends DataContainer implements DataContainerInterface, IBORfKnowledgeBaseValue {
private static String m_boName = "com.ai.ruleframe.mgmt.tenant.bo.BORfKnowledgeBase";
@ParamsAnn(colName = "RFS0010001") // 國際化編碼后裸,保存在 BASE.BS_I18N_RESOURCE 中
public final static String S_State = "STATE";
@ParamsAnn(colName = "RFS0010003")
public final static String S_BaseCode = "BASE_CODE";
public final static String S_Remarks = "REMARKS";
@ParamsAnn(colName = "RFS0010005", primaryKey = true)
public final static String S_BaseId = "BASE_ID";
@ParamsAnn(colName = "RFS0010004")
public final static String S_BaseName = "BASE_NAME";
@ParamsAnn(colName = "RFS0010002")
public final static String S_TenantId = "TENANT_ID";
public final static String S_Notes = "NOTES";
// 后面的get、set方法就不貼了骏啰。离斩。银舱。
}
驗(yàn)證main方法
public class TestCheckField {
public static void main(String[] args) throws Exception {
// 默認(rèn)前臺傳過來的key值和bean對象中字段保持一致,如果不一致跛梗,做一個mapping轉(zhuǎn)換寻馏。參考吉利給的java內(nèi)省
Map input = new HashMap();
input.put("TENANT_ID", "1000000000");
input.put("BASE_CODE", "TEST_RULE_4");
input.put("BASE_NAME", "規(guī)則引擎測試4");
input.put("NOTES", "規(guī)則引擎測試4");
input.put("STATE", "");
input.put("REMARKS", "");
// 直接將入?yún)nput轉(zhuǎn)成后臺能識別的bean對象
BORfKnowledgeBaseBean bean = PartTool.toBo(input, BORfKnowledgeBaseBean.class);
// 判斷關(guān)鍵字段不能為空
BeanWrapper.validate(bean);
// 新增保存方法注釋掉
// bean.setStsToNew();
// RfFactory.getIRfKnowledgeBaseDAO().add(bean);// 新增
// return createReturnMap(null, 1, "執(zhí)行完成", ReturnCode.SUCCESS);
}
}
驗(yàn)證結(jié)果
Exception in thread "main" com.ai.common.i18n.BusinessException:
狀態(tài)[State]字段不能為空!
at com.ai.common.util.ExceptionUtil.throwBusinessException(ExceptionUtil.java:59)
at com.ai.ruleframe.tools.BeanWrapper.validate(BeanWrapper.java:59)
at generatetemp.TestCheckField.main(TestCheckField.java:23)