判斷Bean對象指定字段非空

判斷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)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末核偿,一起剝皮案震驚了整個濱河市诚欠,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌漾岳,老刑警劉巖轰绵,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異尼荆,居然都是意外死亡左腔,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進(jìn)店門捅儒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來液样,“玉大人,你說我怎么就攤上這事野芒⌒畛睿” “怎么了?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵狞悲,是天一觀的道長撮抓。 經(jīng)常有香客問我,道長摇锋,這世上最難降的妖魔是什么丹拯? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮荸恕,結(jié)果婚禮上乖酬,老公的妹妹穿的比我還像新娘。我一直安慰自己融求,他們只是感情好咬像,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般县昂。 火紅的嫁衣襯著肌膚如雪肮柜。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天倒彰,我揣著相機(jī)與錄音审洞,去河邊找鬼。 笑死待讳,一個胖子當(dāng)著我的面吹牛芒澜,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播创淡,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼痴晦,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了辩昆?” 一聲冷哼從身側(cè)響起阅酪,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤旨袒,失蹤者是張志新(化名)和其女友劉穎汁针,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體砚尽,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡施无,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了必孤。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片猾骡。...
    茶點(diǎn)故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖敷搪,靈堂內(nèi)的尸體忽然破棺而出兴想,到底是詐尸還是另有隱情,我是刑警寧澤赡勘,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布嫂便,位于F島的核電站,受9級特大地震影響闸与,放射性物質(zhì)發(fā)生泄漏毙替。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一践樱、第九天 我趴在偏房一處隱蔽的房頂上張望厂画。 院中可真熱鬧,春花似錦拷邢、人聲如沸袱院。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽忽洛。三九已至抛人,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間脐瑰,已是汗流浹背妖枚。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留苍在,地道東北人绝页。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像寂恬,于是被迫代替她去往敵國和親续誉。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內(nèi)容