Javabean非空变量校验工具
摘要 调研java Class getDeclaredFields() 与getFields()的区别,设计请求参数为Javabean时,基于反射机制校验其中非空变量的公共方法。
java Class getDeclaredFields() 与getFields()的区别
概述:
(1)getDeclaredFields() 返回Class中所有的字段,包括私有字段;
(2)getFields 只返回公共字段,即由public修饰的字段。
测试之前,请定义一个代表员工的EmployeeDTO类,成员变量访问控制修饰符包括public等,当前,实际定义Javabean的时候,成员变量的控制修饰符是只可以为private的。
public class EmployeeDTO {
public Integer id;
private String sex;
private String name;
protected String job; // 职位
public Integer jobNumber;// 工号
private float salary;
String phone;
// 省略get、set方法
}
测试用例,一个main函数:
public class ValidationTest {
public static void main(String[] args) {
// testGetDeclaredFields();
// System.err.println(" ==================== ");
// testGetFields();
validateIsEmpty();
}
public static void testGetDeclaredFields() {
Field[] fields = EmployeeDTO.class.getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
Field field = fields[i];
System.out.println(field.getName());
}
}
public static void testGetFields() {
Field[] fields = EmployeeDTO.class.getFields();
for (int i = 0; i < fields.length; i++) {
Field field = fields[i];
System.out.println(field.getName());
}
}
}
testGetFields ()打印结果:
id
jobNumber
testGetDeclaredFields ()打印结果:
id
sex
name
job
jobNumber
salary
phone
由测试结果可见,上述概述成立。
校验Java bean中非空字段
在ValidationTest中新增如下函数:
public static void validateIsEmpty() {
EmployeeDTO emp = new EmployeeDTO();
emp.setId(100);
emp.setJob(null);
emp.setJobNumber(100001);
List<String> checkedFieldNames = new ArrayList<>();
checkedFieldNames.add("id");
checkedFieldNames.add("job");
checkedFieldNames.add("jobNumber");
try {
ValidationUtils.checkNotEmpty(emp, checkedFieldNames);
} catch (Exception e) {
System.out.println("-----------");
System.out.println(e.getMessage());
}
}
其中,本章节的主角ValidationUtils源码如下:
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.List; /**
* @Description 校验工具类
*/
public class ValidationUtils { private final static String PIX_GET = "get"; /**
* @Description 只校验列表中传入的字段,断言对象中的字段值非空
*
* @param object 待检测对象
* @param checkedFieldNames 被检查变量
* @throws Exception 如果被校验字段的值为空,抛出此异常
*/
public static void checkNotEmpty(Object object, List<String> checkedFieldNames) throws Exception {
if (null == object) {
throw new Exception("Param is NULL");
}
Class<?> clazz = object.getClass();
Field[] fields = clazz.getDeclaredFields();
String fieldName = "";
StringBuilder methodName = null;
Method method = null;
for (Field field : fields) {
fieldName = field.getName();
if (!hasElement(fieldName, checkedFieldNames)) {
continue;
}
methodName = new StringBuilder(PIX_GET);
methodName = methodName.append(fieldName.substring(0, 1).toUpperCase())
.append(fieldName.substring(1));
method = clazz.getDeclaredMethod(methodName.toString());
Object result = method.invoke(object);
if (null == result || "".equals(result)) {
throw new Exception("Non-empty field 【".concat(fieldName).concat("】 is empty"));
}
}
} /**
* 检测container数组是否包含element元素
*
* @return boolean,true 包含
*/
private static boolean hasElement(String element, List<String> containers) {
if (containers.contains(element)) {
return true;
}
return false;
}
}
在main函数中调用后,控制台打印如下信息:
|
Non-empty field 【job】 is empty |
表明校验成功,如果为job赋值为非空,则不再提示此信息。至于其它成员变量,同理可以测试。
所以,在校验实际业务场景中的JavaBean的时候,就无需每次手动校验了。丢给ValidationUtils即可,是不是很方便?
Javabean非空变量校验工具的更多相关文章
- 使用AOP和Validator技术对项目接口中的参数进行非空等校验
javax.validation.Validator基础知识补充: validator用来校验注解的生效,如: @NotBlank(message = "地址名不能为空") pri ...
- js的非空校验
利用TagName获取元素名称,进行批量非空校验 var input = document.getElementsByTagName("input"); for (var i=0; ...
- kotlin之变量的可空与非空
版权声明:本文为xing_star原创文章,转载请注明出处! 本文同步自http://javaexception.com/archives/218 kotlin之变量的可空与非空 上面一篇文章,介绍了 ...
- JavaScript 数据值校验工具类
/** * 数据值校验工具类 */ var checkService = { // 不校验 none: function () { return true; }, //非空校验 isEmpty: fu ...
- java基础之----非空判断
大家好,第一次写博客,一直想写博客,用于自我总结,也用于帮助新同学成长. 平常我们开发的时候,用到很多非空判断,但是很多同学用到的地方不是很准确,这里,我把自己平时遇到的坑跟大家说说.我废话不多,只想 ...
- unity, 非public变量需要加[SerializeField]才能序列化
非public变量需要加[SerializeField]才能序列化 例如: MonoBehaviour中: [SerializeField] private float m_xxx; 在相应的Cust ...
- 非空验证(源代码Java版)
import java.util.Map; /** * 非空验证工具类 */ public class UntilEmpty { /** * @see: 验证string类型的是否为空 */ publ ...
- 数据库六大约束用法:主键(primary key)、外键(foreign key)、非空(not null)、默认(default)、检查(check)、唯一(unique)
1. 数据库有六大约束 主键(primary key) 外键(foreign key):被参照的键必须有唯一约束或是主键 非空(not null) 默认(default) 检查(check):orac ...
- JS中if判断 非空即为真 非0即为真
1.字符串参与判断时:非空即为真判断字符串为空的方法if(str!=null && str!=undefined && str !='')可简写为if(!str){ ...
随机推荐
- Weka算法Clusterers-Xmeans源代码分析(一)
<p></p><p><span style="font-size:18px">上几篇博客都是分析的分类器算法(有监督学习),这次就分 ...
- 【Git】简单使用
[Git & Github] 首先不能混淆两者的概念.git是一个类似于svn的版本管理工具.其可以在本地建立起针对一个项目的众多维度的版本管理体系,提升了开发的效率. 相对的,我们如果想要和 ...
- Java知多少(93)鼠标事件
鼠标事件的事件源往往与容器相关,当鼠标进入容器.离开容器,或者在容器中单击鼠标.拖动鼠标时都会发生鼠标事件.java语言为处理鼠标事件提供两个接口:MouseListener,MouseMotionL ...
- JS =>处理单击事件与拖动事件并存
使用click事件,很难确定在拖动开始和结束的时候触发,所以使用了onmouseup(释放鼠标的时候),释放鼠标的时候,即在拖动还未结束,但是准备处理的阶段,此时mouseButtonFlag按照逻辑 ...
- linux相关(3)
1. shell环境变量 能够存在于本shell进程及其子shell进程的变量.变量可以从父shell进程传递给子shell进程,而不能反过来,因此环境变量在子shell进程中无论如何修改都不会影响到 ...
- 在一个由 'L' , 'R' 和 'X' 三个字符组成的字符串(例如"RXXLRXRXL")中进行移动操作。一次移动操作指用一个"LX"替换一个"XL",或者用一个"XR"替换一个"RX"。现给定起始字符串start和结束字符串end,请编写代码,当且仅当存在一系列移动操作使得start可以转换成end时, 返回True。
在一个由 'L' , 'R' 和 'X' 三个字符组成的字符串(例如"RXXLRXRXL")中进行移动操作.一次移动操作指用一个"LX"替换一个"XL ...
- 关于思科C2950交换机清除密码,恢复初始配置的方法
上个月河南做项目,因需要大批量的对服务器进行操作系统的安装,于是想到了PXE网络批量安装, 好不容易到机房的仓库找到网线及一台思科交换机,但到安装的时候,发现思科交换机里应该有配置了 通过配置线连接交 ...
- WordPlayer
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.D ...
- SQL中的between and
"between xx and xx "在SQL中的用法 这个大家都很熟悉,但是当问到是否包含两端的值时,就有点儿不确定了.在W3School网站上,有这样的一段话: 参考:ht ...
- 20165311 实验一 Java开发环境的熟悉
一.实验报告封面 课程:Java程序设计 班级:1653班 姓名:李嘉昕 学号:20165311 指导教师:娄嘉鹏 实验日期:2018年4月2日 实验时间:13:45 - 15:25 实验序号:3 实 ...