springmvc、springboot 參數校驗

參數校驗在項目中是必不可少的,不只前端須要校驗,爲了程序的可靠性,後端也須要對參數進行有效性的校驗。下面將介紹在springmvc或springboot項目中參數校驗的方法

準備工做:前端

引入校驗須要用到的依賴java

 

 

 首先放上咱們的測試對象spring

 

方法1、所有使用註解的方式進行校驗

能夠看到,咱們在測試對象中加上了@NotBlank和@NotEmpty註解,表示該字段須要進行校驗,下面咱們進行測試apache

咱們在須要校驗的對象前面加上@Valid註解後端

測試方法:springboot

 

運行結果:mvc

這樣咱們就完成了參數校驗,而且獲取到了錯誤的信息。可是須要注意的是,咱們想要拿到錯誤信息的時候還須要用到BindingResult對象,若是項目中有多處須要進行校驗的話,BindResult參數用到得特別頻繁,致使代碼看起來不少餘,因此咱們使用第二種方法,自定義參數校驗。測試

方法2、自定義參數校驗方法

自定義校驗類的代碼以下ui

package com.me.util;

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());
}

}


}

咱們對拋出的異常進行了全局捕獲google

一樣,咱們須要標誌校驗規則

 

測試方法:

運行結果:

相關文章
相關標籤/搜索