您的位置:首页 > 其它

使用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,修改原有的业务逻辑代码;最后在需要验证的变量上面加上相应的注解就可以了。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: