一:介绍

在写后端时,面对多个参数,比如手机号码、密码等我们常常需要写验证逻辑,当需要验证的参数较多的时候我们会需要写很多的判断语句,这就造成了大量的代码冗余。因此我开发了一套参数验证器,只需要调用参数验证器实例化对象的校验方法即可对传入的对象中的所有参数进行校验。一句话就完成了对所有参数的校验。

项目使用案例:

完成注册业务:

 @RestController
@RequestMapping("/cmpas/user")
public class UserController {
@Autowired
private IUserService iUserService;
@Autowired
private ResultData resultData;
@Autowired
private ParameterValidator parameterValidator;
@RequestMapping(value = "/register",params = {"PhoneNumber","Password","NickName","RealName","Gender"})
public ResultData register(HttpSession httpSession, User user)
{
resultData.setResult(parameterValidator.validate(user));
if(resultData.getResult().equals(ParameterValidator.SUCESS))
{
//校验成功
if (iUserService.insert(user))
resultData.setResult("注册成功");
else
resultData.setResult("注册失败");
}
//将错误原因返回
return resultData;
}
}

二:开发场景模拟(注册用户)

1:用户实体

public class User{
private String Username;
private String Password; //get、set方法
}

 

2:开发自己的参数校验器(继承抽象类AbstractParameterValidator,写入自己的校验方法)

public class ParameterValidator extends AbstractParameterValidator{
  //校验用户名的方法
  public String Username(String str)
  {
    String back="用户名不合法";//错误提示
    String regex="[0-9a-zA-Z]{1,12}";//正则表达式
    return str.matches(regex)?SUCCESS:back;//返回
  }
  //校验密码的方法
  public String Password(String str)
  {
    String back="密码不合法";
    String regex="[0-9a-zA-Z]{8,20}";
    return str.matches(regex)?SUCCESS:back;
  }
}

  

2:新建一个用户实体

User user=new User();
//对用户实例user进行赋值
user.setUsername("HumorChen");
user.setPassword("123456");

  

调用参数校验器示范:

//实例化参数验证器对象
ParameterValidator parameterValidator=new ParameterValidator();
//调用校验方法
String result=parameterValidator.validate(user);

  调用的时候只需要使用

parameterValidator.validate(user);
全部通过校验则返回值为AbstractParameterValidator.SUCCESS
否则为不通过的原因

 

三:结构

核心方法validate(Object... objects) 对传入的对象中的所有字段去我们自己编写的参数校验器类中去找有没有同名方法,也就是找有没有需要被核验,如果需要就进行校验,最终将结果返回

     public String validate(Object... objects) {
StringBuilder stringBuilder = new StringBuilder();
for (Object object : objects)
for (Field field : object.getClass().getDeclaredFields()) {
field.setAccessible(true);
Method method = null;
try {
method = this.getClass().getDeclaredMethod(field.getName(), String.class);
} catch (Exception e) { }
if (method != null) {
String result =null;
try{
result=(String) method.invoke(this, field.get(object));
//输出日志
log(field.getName(),field.get(object),result);
}catch (Exception e){}
if (!result.equals(SUCESS)) {
if (stringBuilder.length() > 0 && (!outputAllError))
return stringBuilder.toString();
stringBuilder.append(result);
stringBuilder.append("\n");
}
}
}
return stringBuilder.length() == 0 ? SUCESS : stringBuilder.toString();
}
 

后端参数校验器v1.0(调用一个方法校验所有参数并得到校验结果,且包括错误原因)的更多相关文章

  1. 硬盘图标修改器 V1.0 绿色版

    软件名称:硬盘图标修改器 V1.0 绿色版软件语言: 简体中文授权方式: 免费软件应用平台: Win7 / Vista / Win2003 / WinXP / Win2008 软件大小: 12.3MB ...

  2. 迷你音乐播放器v1.0正式上线!

    迷你音乐播放器V1.0正式上线! 版本介绍: 1.随机播放切换开关(通过点击专辑图片) 2.通过拖动歌曲名及艺术家名调整歌曲播放进度 3.手机浏览访问支持熄屏播放 4.暂不支持在线搜索功能 快来一起分 ...

  3. 利用Ajax调用controller方法并传递参数

    一.背景由于近期工作需要将人脸识别功能与选课系统结合,但是对前端知识了解的很少,只能边做边学了,因此在这边把遇到的一些坑说明一下,希望能帮助到像我一样的初学者 二.具体内容这里采用框架为MVC,如果想 ...

  4. Groovy小结:java调用Groovy方法并传递参数

    Groovy小结:java调用Groovy方法并传递参数 @(JAVA总结) 1. 场景描述 在网上查了资料发现,java有三种方式调用groovy脚本.但是真正在实际的服务器环境中,嵌入groovy ...

  5. SmartIDE v1.0.23 一个非常不敏捷的发布

    SmartIDE v1.0版本(CLI Build v1.0.23.4650,Server Build v1.0.23.4646)已经发布,在超过4000 个 Builds 之后,我们终于发布了v1. ...

  6. android黑科技系列——分析某直播App的协议加密原理以及调用加密方法进行协议参数构造

    一.前言 随着直播技术火爆之后,各家都出了直播app,早期直播app的各种请求协议的参数信息都没有做任何加密措施,但是慢慢的有人开始利用这个后门开始弄刷粉关注工具,可以让一个新生的小花旦分分钟变成网红 ...

  7. odoo14 button 事件调用python方法如何传递参数

    1 <field name="user_ids" 2 mode="kanban" 3 nolabel="1" 4 options=&q ...

  8. 调用save()方法,页面显示保存成功,但是数据库中没有值的原因

    在DAO层调用save()方法,页面上显示成功,但是在数据库中查找时发现数据没有保存到数据库中的原因可能是: 1.Service层中是否在调用DAO层中的save()方法之前添加注解@Transact ...

  9. [Chrome插件] SelectJd(京东自营筛选器) v1.0.0 发布

    如今京东的商品列表已经没有"自营"筛选了,只有"京东物流"筛选.导致找商品时不方便. 于是我开发了一下Chrome插件--SelectJd(京东自营筛选器). ...

随机推荐

  1. 逐层解析请求json参数字符串【我】

    import net.sf.json.JSONObject; 逐层解析请求json参数字符串: InputStream inStream =null; BufferedReader br =null; ...

  2. rs-enumerate-devices data

    realsense rs2::context ctx; auto devicelist = ctx.query_devices(); if (devicelist.size() > 0) { r ...

  3. Flutter实战(四)---LoadingDialog

    原文链接:https://blog.csdn.net/johnWcheung/article/details/89634582

  4. Spring cloud微服务安全实战-5-5实现授权码认证流程(1)

    目前为止已经完成了完整的用户逻辑 目前的问题是,用户在登陆的时候,用户名提交的是给前端服务器的.每个前端服务器的开发人员都可能接触到前端的用户名密码. 每一个客户端应用都要去处理登陆的逻辑,一单我的登 ...

  5. STL补充--set集合相等判断

    一:问题引出 #include <iostream> #include <map> #include <set> using namespace std; map& ...

  6. wave数据集的回归曲线

    wave数据集的回归曲线 import matplotlib.pyplot as pltimport mglearnfrom scipy import sparseimport numpy as np ...

  7. sql 获取某一时段中每一天中最大的时间的一条记录

    SELECT *FROM ( SELECT ROW_NUMBER() OVER( PARTITION BY CONVERT(CHAR(10), DataTime, 120) ORDER BY Data ...

  8. django.db.utils.OperationalError: (1251, 'Client does not support authentication protocol requested by server; consider upgrading MySQL client')

    1.打开MySQL: cmd里 net start mysql mysql -hlocalhost -uroot -p回车 进入mysql数据库 2. 命令如下: 1.use mysql; 2.alt ...

  9. springboot 整合 Froala Editor 3

    springboot项目中使用 Froala Editor 3,参考官网文档:https://www.froala.com/wysiwyg-editor/docs/overview 下载文件后,引入c ...

  10. 《第一本Docker书》学习笔记——第4章 使用Docker镜像和仓库

    4.2 列出镜像 使用docker images命令: sudo docker images 本地镜像都保存在Docker宿主机的/var/lib/docker目录下. 也可以在/var/lib/do ...