参数校验在项目中是必不可少的,不只前端须要校验,为了程序的可靠性,后端也须要对参数进行有效性的校验。下面将介绍在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
一样,咱们须要标志校验规则
测试方法:
运行结果: