1. 程式人生 > >springmvc、springboot 引數校驗

springmvc、springboot 引數校驗

引數校驗在專案中是必不可少的,不僅前端需要校驗,為了程式的可靠性,後端也需要對引數進行有效性的校驗。下面將介紹在springmvc或springboot專案中引數校驗的方法

準備工作:

引入校驗需要用到的依賴

 

 首先放上我們的測試物件

方法一、全部使用註解的方式進行校驗

可以看到,我們在測試物件中加上了@NotBlank和@NotEmpty註解,表示該欄位需要進行校驗,下面我們進行測試

我們在需要校驗的物件前面加上@Valid註解

測試方法:

執行結果:

這樣我們就完成了引數校驗,並且獲取到了錯誤的資訊。但是需要注意的是,我們想要拿到錯誤資訊的時候還需要用到BindingResult物件,如果專案中有多處需要進行校驗的話,BindResult引數用到得特別頻繁,導致程式碼看起來很多餘,所以我們使用第二種方法,自定義引數校驗。

方法二、自定義引數校驗方法

自定義校驗類的程式碼如下


import com.google.common.base.Preconditions;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.me.exception.ParamException;
import org.apache.commons.collections.MapUtils;

import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import java.util.*;

public class BeanValidator {
    // Validator工廠
    private static ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory();

    // Map<String,String> 中 key表示錯誤的欄位,value表示錯誤資訊

    /**
     * 校驗單個物件
     *
     * @param t
     * @param groups
     * @param <T>
     * @return
     */
    public static <T> Map<String, String> validate(T t, Class... groups) {
        Validator validator = validatorFactory.getValidator();
        // 傳入引數,並獲取校驗結果
        Set validatorErrors = validator.validate(t, groups);
        // 若校驗為空,說明校驗通過,返回空集合
        if (validatorErrors.isEmpty()) {
            return Collections.emptyMap();
        } else {
            LinkedHashMap<String, String> errors = Maps.newLinkedHashMap();
            // 對校驗錯誤資訊進行遍歷
            Iterator iterator = validatorErrors.iterator();
            while (iterator.hasNext()) {
                ConstraintViolation violation = (ConstraintViolation) iterator.next();
                // 放入key,value
                errors.put(violation.getPropertyPath().toString(), violation.getMessage());
            }
            return errors;
        }
    }

    /**
     * 校驗多個物件
     *
     * @param collection
     * @return
     */
    public static Map<String, String> validateList(Collection<?> collection) {
        // 判斷是否為空,為空時丟擲異常
        Preconditions.checkNotNull(collection);
        Iterator iterator = collection.iterator();
        Map errors;
        do {
            if (!iterator.hasNext()) {
                return Collections.emptyMap();
            }
            // 取到當前值
            Object object = iterator.next();
            errors = validate(object, new Class[0]);
        } while (errors.isEmpty());
        return errors;
    }

    public static Map<String, String> validateObject(Object first, Object... objects) {

        if (objects != null && objects.length > 0) {
            return validateList(Lists.asList(first, objects));
        } else {
            return validate(first, new Class[0]);
        }
    }

    public static void check(Object param) throws ParamException {
        Map<String, String> errors = validateObject(param);
        if (MapUtils.isNotEmpty(errors)) {
            throw new ParamException(errors.toString());
        }

    }
}

 

我們對丟擲的異常進行了全域性捕獲

同樣,我們需要標誌校驗規則

測試方法:

執行結果: