java 对象验证非空_判断Bean对象指定字段非空
判断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对象指定字段非空相关推荐
- java判断二维数组是否空_判断二维数组是否为空
在Java程序设计里面,相信大部分人都知道如何判断一个一维数组是否为空,示例如下: public int primeNumberCount(int[] array){ if(array==null|| ...
- java 判断对象的属性是否为空_Java 判断实体对象及所有属性是否为空的操作
1.判断实体对象是否为空 2.判断对象所有属性是否为空 3.特别注意,实体类中如果有基本数据类型,会影响判断 package com.liuxd.object; import org.apache.c ...
- java 实体建表 注释_实体bean,entity 注解设置
持久化是位于JDBC之上的一个更高层抽象.持久层将对象映射到数据库,以便在查询.装载.更新或删除对象的时候,无须使用像JDBC那样繁琐的API.EJB的早期版本中,持久化是EJB平台的一部分.EJB3 ...
- java怎么判断json是否为空_java判断jsonObject和jsonArray是否为空
resJsonObj = {"res":"0","msg":"","data":{"Nam ...
- python函数调用的三种方式_判断python对象是否可调用的三种方式及其区别
基本上判断python对象是否为可调用的函数,有三种方法: 1.使用内置的callable函数 callable(func) 用于检查对象是否可调用,返回True也可能调用失败,但是返回False一定 ...
- Java JSON、XML文件/字符串与Bean对象互转解析
前言 在做web或者其他项目中,JSON与XML格式的数据是大家经常会碰见的2种.在与各种平台做数据对接的时候,JSON与XML格式也是基本的数据传递格式,本文主要简单的介绍JSON/XML ...
- python判断文件是否为空文件对象_判断Python对象是不是为文件对象的方法有哪些...
判断Python对象是不是为文件对象的方法有哪些 发布时间:2020-08-13 14:01:00 来源:亿速云 阅读:76 作者:小新 这篇文章主要介绍判断Python对象是不是为文件对象的方法有哪 ...
- 6.java中什么是类_类、对象(java基础知识六)
1.Java约定俗成 java约定俗成1,类名接口名 一个单词首字母大写,多个单词每个单词首字母都大写2,方法名和变量名 一个单词全部小写,多个单词从第二个单词首字母大写 建议:如果能用英语尽量用英语 ...
- mysql 判断list不为空_判断List集合为空还是null的正确打开方式
事故场景还原 最近在写一个项目的时候遇到一个这样一个问题,我简单的还原一下场景,这是模拟一个简单的管理系统 ① 一张简单的客户表 CREATE TABLE customer( id INT(11) N ...
最新文章
- vs2008中xlslib与libxls库的编译及使用
- python 代码生成器 oc_iOS 移动端生成工具开发
- 【Python】学习笔记总结9(数据库与Python交互)
- mysql微服务查询问题_微服务架构下,Mysql读写分离后,数据库CPU飙升卡壳问题解析...
- 3青春痘长在哪里不害怕
- C++ Sets MultiSets
- linux下文件删除的原理精华讲解(考试题答案系列)
- Windows中MySQL主从数据库搭建(三)
- 山东财经大学燕山学院计算机王栋,选修课Photoshop王栋的群谁有
- 产品经理职场面试35个经典问题
- 各种通信接口的简单对比
- Android手机投屏利器米卓同屏助手
- 前端快速切图:PS切图常用快捷键、精准测量尺寸
- Go语言(Golang)超时机制
- 计算机键盘的标点怎么打出来,电脑键盘上的标点符号怎么打(教你如何输入正确的标点符号)...
- javascript大全
- 信息系统安全管理架构
- 模糊测试框架 Sulley 使用手记 (一)
- 【html标签复习】
- 入手python时踩过的坑——缩进篇