使用validator优化常用的校验规则
2019-04-27 10:20
507 查看
前言
很多系统都要有用户模块,就是实现用户的注册,登录的功能,而这个时候我们总是需要写很多的业务逻辑代码来判断用户输入的年龄,性别,密码不能为空并且年龄必能小于0,不能大于150之类的,这样子的diamante虽然写起来并不难,但是却很烦,最近学习了一个简便的校验规则来进行优化。
导入相应的包
可以直接在maven仓库找:
<dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator</artifactId> <version>6.0.13.Final</version> </dependency>
创建返回结果类型
一般范湖结果就是是否有错,是额还那么错,所以在返回结果对象这里定义一个boolean类型和一个Map类型的结果:
package com.lixiaoli.validator; import org.apache.commons.lang3.StringUtils; import java.util.HashMap; import java.util.Map; public class validationResult { //校验结果是否有错 private boolean hasError=false; //存放错误信息的map private Map<String,Object> errMsgMap=new HashMap<>(); public boolean isHasError() { return hasError; } public void setHasError(boolean hasError) { this.hasError = hasError; } public Map<String, Object> getErrMsgMap() { return errMsgMap; } public void setErrMsgMap(Map<String, Object> errMsgMap) { this.errMsgMap = errMsgMap; } //实现的通用的格式化信息获取结果的方法 public String getErrMsg(){ return StringUtils.join(errMsgMap.values().toArray(), ","); } }
getErrMsg是公用方法,将出错结果封装,用逗号隔开。
定义实现InitializingBean接口的实现类
InitializingBean是一个封装好的接口,直接用即可:
import org.springframework.beans.factory.InitializingBean; import org.springframework.stereotype.Component; import javax.validation.ConstraintViolation; import javax.validation.Validation; import javax.validation.Validator; import java.util.Set; @Component public class validatorImpl implements InitializingBean{ private Validator validator; //小海鲜校验方法并返回校验对象 public validationResult validate(Object bean){ validationResult result=new validationResult(); Set<ConstraintViolation<Object>> constraintViolationSet=validator.validate(bean); if(constraintViolationSet.size()>0){ //表示有错 result.setHasError(true); constraintViolationSet.forEach(constraintViolation->{ String errMsg=constraintViolation.getMessage(); String propertyName=constraintViolation.getPropertyPath().toString(); result.getErrMsgMap().put(propertyName,errMsg); }); } return result; } @Override public void afterPropertiesSet() throws Exception { //将hibemate validator通过工厂的初始化将其实例化 this.validator= Validation.buildDefaultValidatorFactory().getValidator(); } }
在service实现类中自动注入validator的实现类
@Autowired private validatorImpl validator;
修改原来的业务逻辑
可以把之前写的那些判断的语句注释掉,然后加上对应的其他代码:
validationResult result= validator.validate(userModel); if(result.isHasError()) { throw new BussnessException(EmBussinessError.PARAMETER_VALIDATIN_ERROR,result.getErrMsg()); }
索命一下,这里的BussnessException是我自己行医的出错类,这里大家不能直接copy,需要自己修改。
在需要验证的字段上加上相应的注解
@NotBlank(message = "用户名不能为空") private String name; @NotNull(message = "性别不能不填") private Integer gender; @NotNull(message = "性别不能不填") @Min(value = 0,message = "年龄不能小于0") @Max(value = 150,message = "年龄不能超过150") private Integer age; @NotBlank(message = "手机号不能为空")
结果
这样子如果字段很多的话,就不用写一大堆繁杂的业务逻辑了,
总结
第一个就是要导入相应的包;然后定义一个统一的返回对象;接着呢就是具体的实现类,具体的实现类上面要加上component的注解(本人用的是springboot的框架);然后就是在service的实现层自动注入相应的bean,修改原有的业务逻辑代码;最后在需要验证的变量上面加上相应的注解就可以了。
相关文章推荐
- 一个用户名的多重校验规则,使用的是 jQuery.validator (包含 jQuery.validator加入自定义的方法)
- 对一个QQ号码进行简单的校验功能(不使用正则表达式与使用正则表达式)!内附常用的正则表达式的规则
- Yii2 Model的一些常用rules规则,使用Validator验证
- Wireshark抓包工具使用教程以及常用抓包规则
- Wireshark抓包工具使用教程以及常用抓包规则
- Intellij13 IDEA常用快捷键 (mac 10.5 +),优化,使用出现的问题汇总
- 常用PHP中花括号使用规则详解
- Wireshark抓包工具使用教程以及常用抓包规则
- Wireshark抓包工具使用教程以及常用抓包规则
- 【Struts2十】校验表达二:使用xml配置validator来校验表单
- Wireshark抓包工具使用教程以及常用抓包规则
- Wireshark抓包工具使用教程以及常用抓包规则
- Wireshark抓包工具使用教程以及常用抓包规则
- Intellij13 IDEA常用快捷键 (mac 10.5 +),优化,使用出现的问题汇总
- EasyUI 扩展自己定义EasyUI校验规则 验证规则(经常使用的)
- Struts2中使用校验文件对表单的校验以及常用的校验
- jquery.validate.js使用之自定义表单验证规则,下面列出了一些常用的验证法规则
- EasyUI 扩展自定义EasyUI校验规则 验证规则(常用的)
- Wireshark抓包工具使用教程以及常用抓包规则
- Wireshark抓包工具使用教程以及常用抓包规则