一:介绍

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

项目使用案例:

完成注册业务:

 @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();
}
 

最新文章

  1. 古诗词api,诗词接口,诗词api,中国诗词
  2. BZOJ1093 [ZJOI2007]最大半连通子图
  3. LeetCode 176 Second Highest Salary mysql,select 嵌套 难度:1
  4. mysql性能瓶颈分析、性能指标、指标搜集方法与性能分析调优工具
  5. Cocos2dx使用wxsqlite开源加密SQLite3数据库
  6. ubuntu 常用参数设置
  7. LINQ to XML(1)
  8. libpcap/wwinpcap
  9. C++ Name Mangling 为什么不编码返回值参数
  10. Final对象
  11. 硬盘安装windows7
  12. Jackson 框架,轻易转换JSON【转】
  13. 有关typename
  14. HTML页面加载异常,按F12调试后居然又好了的解决办法!
  15. DotNetCore跨平台~为Lind.DotNetCore框架添加单元测试的意义
  16. jQuery使用(十三):工具方法
  17. PL/SQL编程--变量声明及赋值
  18. 综合出现NSScanner: nil string argument libc++abi.dylib: terminat错误的解决方案
  19. 内核加载模块时提示usb_common: exports duplicate symbol of_usb_get_dr_mode
  20. 关于rand 与 randn

热门文章

  1. hive分区表新增字段,已有分区显示为null
  2. 【BIGEMAP一键离线地图服务】
  3. Django 将APP存储至统一目录
  4. RabbitMQ 入门教程(PHP版) 第一部分:Hello World
  5. Pycharm一些额外使用笔记
  6. 多个wav音频文件合并(连接)成一个文件
  7. Go 包导入备忘
  8. (十三)class文件结构:常量池(转)
  9. 【Leetcode_easy】925. Long Pressed Name
  10. JavaScript:学习笔记(10)——XMLHttpRequest对象