SpringBoot專案校驗規則優化

席潤發表於2019-02-12
格式化校驗規則

實現前在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的同學觀看,老師基礎講的特別好

相關文章