对前台传过来的实体是否为空 进行为空校验的N种方法
首先定义一个注解,如下
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; @Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface ParamNotNull {
}
简单解释一下,interface前面加@的意思是:
@interface 不是interface,是注解类
是jdk1.5之后加入的,java没有给它新的关键字,所以就用@interface 这么个东西表示了
这个注解类,就是定义一个可用的注解,包括这个注解用于什么地方,是类,还是方法,还是property,还是方法入参等等,还有这个注解是否编译后进入class
比如我们知道的用于javadoc的注解,是不进入class文件的。然后在后面你就可以用这个注解写代码了。
总的来说,这就是一个生成javadoc时用到的注释类
/**
* 对非空参数进行校验,使用注解
* @param model javabean 对象
* @throws ClassNotFoundException
*/
public static CheckResult parameterIsNotNull(Object model) {
try {
Field[] fields = model.getClass().getDeclaredFields();
boolean flag = true;
String fieldstr = "字段:";
for (Field field : fields) {
ParamNotNull annotation = field.getAnnotation(ParamNotNull.class);
if(annotation != null){
String name = field.getName();
if(!chechFiled(model,name,field)){
flag = false;
fieldstr = fieldstr + name + " ";
}
}
}
if(flag){//校验通过
return new CheckResult(true);
}else {//有参数校验不通过
return new CheckResult(ApiResponse.error(Syscode.PARAMETER_ERROR,fieldstr+"不能为空!"));
}
}catch (Exception e){
LOG.error(CheckParameter.class,"对非空参数进行校验时异常 e: " + e.getMessage());
return new CheckResult(ApiResponse.error(Syscode.SYSTEM_EXCEPTION));
}
}
private static boolean chechFiled(Object model,String name,Field field) throws Exception{
boolean flag = true;
name = name.substring(0,1).toUpperCase()+name.substring(1); //将属性的首字符大写,方便构造get,set方法
String type = field.getGenericType().toString(); //获取属性的类型
if(type.equals("class java.lang.String")){ //如果type是类类型,则前面包含"class ",后面跟类名
Method m = model.getClass().getMethod("get"+name);
String value = (String) m.invoke(model); //调用getter方法获取属性值
if(StringUtils.isBlank(value)){
flag = false;
}
}else {
Method m = model.getClass().getMethod("get"+name);
Object value = m.invoke(model);
if(value == null){
flag = false;
}
}
return flag;
}
或者只使用反射机制
/**
* 对非空参数进行校验
* @param model javabean 对象
* @param unCheckField 不校验的字段
* @return
*/
public static CheckResult parameterIsNotNull(Object model, Set<String> unCheckField){
try {
boolean flag = true;
String fieldstr = "字段:";
Field[] field = model.getClass().getDeclaredFields(); //获取实体类的所有属性,返回Field数组
for(int j=0 ; j<field.length ; j++){ //遍历所有属性
String name = field[j].getName(); //获取属性的名字
if(unCheckField.contains(name)){
continue;//不需要校验此字段
}
if(!chechFiled(model,name,field[j])){
flag = false;
fieldstr = fieldstr + name + " ";
}
}
if(flag){//校验通过
return new CheckResult(true);
}else {//有参数校验不通过
return new CheckResult(ApiResponse.error(Syscode.PARAMETER_ERROR,fieldstr+"不能为空!"));
}
}catch (Exception e){
LOG.error(CheckParameter.class,"对非空参数进行校验时异常 e: " + e.getMessage());
return new CheckResult(ApiResponse.error(Syscode.SYSTEM_EXCEPTION));
}
}
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import com.yucheng.cmis.channel.stagedaccess.domain.MapsStagedMaintainInfo;
/**
* 校验参数是否为空
* @author xr
* @param model:参数所在的实体类 paramList:要校验的参数
*
*/
public class ParamCheck {
public static boolean isNotBlank(Object model,List<String> paramList) throws Exception, Exception {
boolean flag = true;
String params = "";
String param = "";
for(int i=0;i<paramList.size();i++) {
params = paramList.get(i);
if (params.indexOf("_") < 0) {
params = params.substring(0,1).toUpperCase()+params.substring(1); //将属性的首字符大写,方便构造get,set方法
System.out.println(params);
Method m = model.getClass().getMethod("get"+params);
String value = (String) m.invoke(model); //调用getter方法获取属性值
if(StringUtils.isBlank(value)){
flag = false;
return flag;
}
} else {
String[] strs = params.split("_");
for (int j=0;j<strs.length;j++) {
params = strs[j].substring(0,1).toUpperCase()+strs[j].substring(1); //将属性的首字符大写,方便构造get,set方法
param += params;
System.out.println(param);
}
Method m = model.getClass().getMethod("get"+param);
String value = (String) m.invoke(model); //调用getter方法获取属性值
if(StringUtils.isBlank(value)){
flag = false;
return flag;
}
}
}
return flag;
}
public static void main(String[] args) throws Exception {
//维护人员信息
MapsStagedMaintainInfo mainInfo = new MapsStagedMaintainInfo();
//mainInfo.setHead("aa");
mainInfo.setBusiManagerStore("bbb");
List<String> paramList = new ArrayList<String>();
paramList.add("head");
paramList.add("busi_manager_store");
boolean result = ParamCheck.isNotBlank(mainInfo, paramList);
System.out.println(result);
}
对前台传过来的实体是否为空 进行为空校验的N种方法的更多相关文章
- 使用java传参调用exe并且获取程序进度和返回结果的一种方法
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 在某个项目中需要考虑使用java后台调用由C#编写的切图程序( ...
- ASP.NET后台中调用前台Javascript函数的几种方法
做web开发,用的技术是aspx.net,可是由于比较习惯于ASP现在做起来,觉得非常别扭,原因在于有很多功能其实在前台可以处理的,但是因为用到了很多webcontrol,导致不断postback.如 ...
- java前台传参json,后台用map或者实体对象接收
(一)前台传js对象,里面包含数组,后台用map接收 (1)第一种情况:数组里不包含js对象 var param ={}: param.id=id; param.name=name; var scor ...
- page = new String(request.getQueryString().getBytes("ISO-8859-1"),"GBK");解决前台传后台乱码问题
page = new String(request.getQueryString().getBytes("ISO-8859-1"),"GBK");解决前台传后台 ...
- RPC 编程 使用 RPC 编程是在客户机和服务器实体之间进行可靠通信的最强大、最高效的方法之一。它为在分布式计算环境中运行的几乎所有应用程序提供基础。
RPC 编程 使用 RPC 编程是在客户机和服务器实体之间进行可靠通信的最强大.最高效的方法之一.它为在分布式计算环境中运行的几乎所有应用程序提供基础.本文介绍 RPC 客户机和服务器之间基本的事件流 ...
- 服务器文档下载zip格式 SQL Server SQL分页查询 C#过滤html标签 EF 延时加载与死锁 在JS方法中返回多个值的三种方法(转载) IEnumerable,ICollection,IList接口问题 不吹不擂,你想要的Python面试都在这里了【315+道题】 基于mvc三层架构和ajax技术实现最简单的文件上传 事件管理
服务器文档下载zip格式 刚好这次项目中遇到了这个东西,就来弄一下,挺简单的,但是前台调用的时候弄错了,浪费了大半天的时间,本人也是菜鸟一枚.开始吧.(MVC的) @using Rattan.Co ...
- 两种方法上传本地文件到github
https://www.jianshu.com/p/c70ca3a02087 自从使用github以来,一直都是在github网站在线上传文件到仓库中,但是有时因为网络或者电脑的原因上传失败.最重要的 ...
- 两种方法上传本地文件到github(转)
自从使用github以来,一直都是在github网站在线上传文件到仓库中,但是有时因为网络或者电脑的原因上传失败.最重要的原因是我习惯本地编辑,完成以后再一起上传github.看过了几个教程,总结出最 ...
- python自动化之上传文件的3种方法和图片预览
ajax上传文件的三种方法 第一种xhr提交 function xhrSubmit(){ // $('#fafafa')[0] var file_obj = document.getElementBy ...
随机推荐
- linux下VLAN设置
1. 安装vlan(vconfig)和加载8021q模块 [root@test0001~]#yum install vconfig [root@test0001~]#modprobe 8021q [r ...
- Pytorch的torch.cat实例
import torch 通过 help((torch.cat)) 可以查看 cat 的用法 cat(seq,dim,out=None) 其中 seq表示要连接的两个序列,以元组的形式给出,例如:se ...
- 忘记MySQL root密码,如何不重启修改
说个前提:mysqld可以处理kill命令发送的信号,如SIGHUP.SIGTERM,SIGHUP信号产生的行为类似于flush命令. 不重启找回root密码首先需要有个较低权限的账号,比如可以修改t ...
- P3302 [SDOI2013]森林(主席树+启发式合并)
P3302 [SDOI2013]森林 主席树+启发式合并 (我以前的主席树板子是错的.......坑了我老久TAT) 第k小问题显然是主席树. 我们对每个点维护一棵包含其子树所有节点的主席树 询问(x ...
- oracle parallel_index hint在非分区表的生效
之前没特别注意,在有些场景下希望使用并行索引扫描的时候,发现parallel_index hint并没有生效,于是抽空看了下文档:The PARALLEL_INDEX hint instructs t ...
- Linux 基础知识选择/填空
选择题 1. 返回调用进程的进程标识号的系统函数是________. A. getpid B. getpgrp C. getppid D. setpid ##A 2. 关于文件系统的安装和卸载,下面描 ...
- 牛客网校招全国统一模拟笔试(二月场)- Java方向
1.请问下面关于与wait()一起使用的方法notify()的各种陈述,哪个正确? A 多个线程同时等待某个条件,则只有等待时间最长的哪个线程被通知 B 多个线程同时等待某条件,则没有办法预测哪个线程 ...
- CSS的初了解(更新中···)
在前面,我们学习了html的结构.基本骨架.起名方式和选择器,接下来,我们就要学习CSS了. 首先,我们要知道CSS是什么. CSS 全称叫层叠样式表,作用是给html添加样式style,添加属性. ...
- 41. 包含min函数的栈
包含min函数的栈 描述 设计一个支持push,pop,top等操作并且可以在O(1)时间内检索出最小元素的堆栈. push(x)–将元素x插入栈中 pop()–移除栈顶元素 top()–得到栈顶元素 ...
- 转方阵|2012年蓝桥杯B组题解析第五题-fishers
(6')转方阵 对一个方阵转置,就是把原来的行号变列号,原来的列号变行号 例如,如下的方阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 转置后变为: 1 5 9 1 ...