判断Bean对象指定字段非空。

方案:

在bean对象上增加注解,指定字段非空,返回异常信息有明确字段描述,省去不必要的if、else判断。

新建注解类

/**

* 参数校验,判断字段非空、返回异常文字(国际化)

**/

@Target(ElementType.FIELD)

@Retention(RetentionPolicy.RUNTIME)

public @interface ParamsAnn {

/**

* 主键标识

*/

boolean primaryKey() default false;

/**

* 不为空属性

*/

boolean isNotNull() default true;

/**

* 字段描述名,可以是中文、英文,可以配置在缓存里面

*/

String colName() default "";

}

BeanHelper工具类,实现非空判断和抛异常

public class BeanHelper {

/**

*

* @Function: com.ai.ruleframe.tools.BeanHelper::validate

* @Description: 根据xxBean对象的字段注解,判断非空并且返回相应的描述(需要支持中英文多语言)

* @param t

* Bean对象

* @return

* @throws Exception

* @version: v1.1.0

* @author: rule_team

* @date: 2019年6月15日 上午10:48:53

*/

public static 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);

// 主键不校验非空,DAO层会自动补充完整

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));// 调用getter方法获取属性值

if (StringUtils.isEmpty(val) || "null".equalsIgnoreCase(val)) {

result = false;

}

} else if ("long".equals(m.getGenericReturnType().toString())) {

// 如果是long是类型,需要看不能小于注解说明的最小值

Long val = (Long) m.invoke(t);// 调用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);// 调用getter方法获取属性值

if (val < 0) {

result = false;

}

}

// 校验失败,统一抛出异常

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方法就不贴了。。。

}

验证main方法

public class TestCheckField {

public static void main(String[] args) throws Exception {

// 默认前台传过来的key值和bean对象中字段保持一致,如果不一致,做一个mapping转换。参考吉利给的java内省

Map input = new HashMap();

input.put("TENANT_ID", "1000000000");

input.put("BASE_CODE", "TEST_RULE_4");

input.put("BASE_NAME", "规则引擎测试4");

input.put("NOTES", "规则引擎测试4");

input.put("STATE", "");

input.put("REMARKS", "");

// 直接将入参input转成后台能识别的bean对象

BORfKnowledgeBaseBean bean = PartTool.toBo(input, BORfKnowledgeBaseBean.class);

// 判断关键字段不能为空

BeanWrapper.validate(bean);

// 新增保存方法注释掉

// bean.setStsToNew();

// RfFactory.getIRfKnowledgeBaseDAO().add(bean);// 新增

// return createReturnMap(null, 1, "执行完成", ReturnCode.SUCCESS);

}

}

验证结果

Exception in thread "main" com.ai.common.i18n.BusinessException:

状态[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)

java 对象验证非空_判断Bean对象指定字段非空相关推荐

  1. java判断二维数组是否空_判断二维数组是否为空

    在Java程序设计里面,相信大部分人都知道如何判断一个一维数组是否为空,示例如下: public int primeNumberCount(int[] array){ if(array==null|| ...

  2. java 判断对象的属性是否为空_Java 判断实体对象及所有属性是否为空的操作

    1.判断实体对象是否为空 2.判断对象所有属性是否为空 3.特别注意,实体类中如果有基本数据类型,会影响判断 package com.liuxd.object; import org.apache.c ...

  3. java 实体建表 注释_实体bean,entity 注解设置

    持久化是位于JDBC之上的一个更高层抽象.持久层将对象映射到数据库,以便在查询.装载.更新或删除对象的时候,无须使用像JDBC那样繁琐的API.EJB的早期版本中,持久化是EJB平台的一部分.EJB3 ...

  4. java怎么判断json是否为空_java判断jsonObject和jsonArray是否为空

    resJsonObj = {"res":"0","msg":"","data":{"Nam ...

  5. python函数调用的三种方式_判断python对象是否可调用的三种方式及其区别

    基本上判断python对象是否为可调用的函数,有三种方法: 1.使用内置的callable函数 callable(func) 用于检查对象是否可调用,返回True也可能调用失败,但是返回False一定 ...

  6. Java JSON、XML文件/字符串与Bean对象互转解析

    前言      在做web或者其他项目中,JSON与XML格式的数据是大家经常会碰见的2种.在与各种平台做数据对接的时候,JSON与XML格式也是基本的数据传递格式,本文主要简单的介绍JSON/XML ...

  7. python判断文件是否为空文件对象_判断Python对象是不是为文件对象的方法有哪些...

    判断Python对象是不是为文件对象的方法有哪些 发布时间:2020-08-13 14:01:00 来源:亿速云 阅读:76 作者:小新 这篇文章主要介绍判断Python对象是不是为文件对象的方法有哪 ...

  8. 6.java中什么是类_类、对象(java基础知识六)

    1.Java约定俗成 java约定俗成1,类名接口名 一个单词首字母大写,多个单词每个单词首字母都大写2,方法名和变量名 一个单词全部小写,多个单词从第二个单词首字母大写 建议:如果能用英语尽量用英语 ...

  9. mysql 判断list不为空_判断List集合为空还是null的正确打开方式

    事故场景还原 最近在写一个项目的时候遇到一个这样一个问题,我简单的还原一下场景,这是模拟一个简单的管理系统 ① 一张简单的客户表 CREATE TABLE customer( id INT(11) N ...

最新文章

  1. vs2008中xlslib与libxls库的编译及使用
  2. python 代码生成器 oc_iOS 移动端生成工具开发
  3. 【Python】学习笔记总结9(数据库与Python交互)
  4. mysql微服务查询问题_微服务架构下,Mysql读写分离后,数据库CPU飙升卡壳问题解析...
  5. 3青春痘长在哪里不害怕
  6. C++ Sets MultiSets
  7. linux下文件删除的原理精华讲解(考试题答案系列)
  8. Windows中MySQL主从数据库搭建(三)
  9. 山东财经大学燕山学院计算机王栋,选修课Photoshop王栋的群谁有
  10. 产品经理职场面试35个经典问题
  11. 各种通信接口的简单对比
  12. Android手机投屏利器米卓同屏助手
  13. 前端快速切图:PS切图常用快捷键、精准测量尺寸
  14. Go语言(Golang)超时机制
  15. 计算机键盘的标点怎么打出来,电脑键盘上的标点符号怎么打(教你如何输入正确的标点符号)...
  16. javascript大全
  17. 信息系统安全管理架构
  18. 模糊测试框架 Sulley 使用手记 (一)
  19. 【html标签复习】
  20. 入手python时踩过的坑——缩进篇

热门文章

  1. 读《破茧成蝶》笔记 — 什么是用户体验设计
  2. 【速学java】 java后台框架 springmvc整合mybatis框架源码
  3. Vertica常用函数
  4. 11.JVMGC基础
  5. 华为鲲鹏认证怎么样?值得考吗
  6. pascal行人voc_PASCAL VOC DATASET
  7. 索尼电视显示由于服务器无法启动,索尼电视无法安装软件怎么办,最新解决办法...
  8. matlab对信号进行均衡处理,信号完整性-我的均衡之CTLE学习笔记
  9. 哪些情况下企业需要支付经济补偿金
  10. 将图片保存到系统相册