springmvc、springboot 引數校驗
阿新 • • 發佈:2018-11-10
引數校驗在專案中是必不可少的,不僅前端需要校驗,為了程式的可靠性,後端也需要對引數進行有效性的校驗。下面將介紹在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()); } } }
我們對丟擲的異常進行了全域性捕獲
同樣,我們需要標誌校驗規則
測試方法:
執行結果: