SpringBoot项目校验规则优化

774 阅读2分钟
格式化校验规则

实现前在pom文件中引入Apache Commons Lang包,使用了其StringUtils工具类;再引入hibernate-validator包来进行校验。

首先,创建一个检验结果类ValidationResult,我们可以在应用程序和我们的Validator校验逻辑之间通过这个ValidationResult去做对应的对接。再创建校验实现类ValidatorImpl,它实现InitializingBean,以实现afterPropertiesSet的方式,即当Spring的Bean初始化完成之后,会回调对应这个ValidatorImpl的实现afterPropertiesSet的方式。因为我们需要包装出Validator(javax.validation.Validator)类(通过javax定义的一套接口Validator是实现Validator的工具),在afterPropertiesSet中,将hibernate validator 通过工厂校验的方式使其实例化,实现javax.validation.Validator接口的校验器,有了这个校验器可以去实现校验方法并返回校验结果。

对字段有什么限制可在model层下对象模型的字段上添加注解如@NotBlank、@NotNull、@Max、@Min等。

上代码:

package com.miaosha.validator;

import org.apache.commons.lang3.StringUtils;

import java.util.HashMap;
import java.util.Map;

public class ValidationResult {
    //检验校验结果是否有错
    private boolean hasErrors = false;

    //存放错误信息的map
    private Map<String,String> errMsgMap = new HashMap<>();

    public boolean isHasErrors() {
        return hasErrors;
    }

    public void setHasErrors(boolean hasErrors) {
        this.hasErrors = hasErrors;
    }

    public Map<String, String> getErrMsgMap() {
        return errMsgMap;
    }

    public void setErrMsgMap(Map<String, String> errMsgMap) {
        this.errMsgMap = errMsgMap;
    }

    //实现通用的通过格式化字符串信息获取错误结果的msg方法
    public String getErrMsg(){
        return StringUtils.join(errMsgMap.values().toArray(),",");
    }
}
package com.miaosha.validator;

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//使其为spring的一个bean,进行类扫描的时候能够扫描到它
public class ValidatorImpl implements InitializingBean {

    private Validator validator;

    //实现校验方法并返回校验结果
    public ValidationResult validate(Object bean){
        final ValidationResult result = new ValidationResult();
        Set<ConstraintViolation<Object>> constraintViolationSet = validator.validate(bean);//若对应bean里边的一些参数的规则违背了对应Validation定义的Annotation(注释),这个set中就会有值
        if (constraintViolationSet.size()>0){
            //有错误
            result.setHasErrors(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 {
        //将hibernate validator 通过工厂校验的方式使其实例化
        this.validator = Validation.buildDefaultValidatorFactory().getValidator();
    }
}

在model层下对象模型的字段上添加注解如@NotBlank、@NotNull、@Max、@Min等注释,校验规则使用例:

//优化校验
 ValidationResult result = validator.validate(userModel);
if (result.isHasErrors()){
            throw new BusinessException(EmBusinessError.PARAMETER_VALIDATION_ERROR,result.getErrMsg());
        }
    
//原先校验方法
 if (StringUtils.isEmpty(userModel.getName())
                ||userModel.getGender()==null
                ||userModel.getAge()==null
                ||StringUtils.isEmpty(userModel.getTelphone())){
            throw new BusinessException(EmBusinessError.PARAMETER_VALIDATION_ERROR);
        }
参考:

慕课课程《SpringBoot构建电商基础秒杀项目》

推荐刚入手SpringBoot的同学观看,老师基础讲的特别好