一:介绍
在写后端时,面对多个参数,比如手机号码、密码等我们常常需要写验证逻辑,当需要验证的参数较多的时候我们会需要写很多的判断语句,这就造成了大量的代码冗余。因此我开发了一套参数验证器,只需要调用参数验证器实例化对象的校验方法即可对传入的对象中的所有参数进行校验。一句话就完成了对所有参数的校验。
项目使用案例:
完成注册业务:
@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();
}