為什么要使用Bean Validation宏所?
當(dāng)我們實現(xiàn)某個接口時千扔,都需要對入?yún)?shù)進(jìn)行校驗.
什么是bean validator?
bean validator是一個配置注解來驗證參數(shù)的框架梭姓,它包含兩部分Bean Validator api和Hibernate Validator.
- Bean Validation API是Java定義的一個驗證參數(shù)的規(guī)范零抬。
- Hibernate Validator是Bean Validation API的一個實現(xiàn)除师。
pom中引入validator相關(guān)依賴
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.3.6.Final</version>
</dependency>
工具類開發(fā)
package com.permission.util;
import com.google.common.base.Preconditions;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import java.util.*;
/**
* @version:1.0.0
* @author: lironghong
* @date: 2019/4/16 23:17
* @description: validator工具類
*/
public class BeanValidator {
//校驗工廠
private static ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory();
/*
* java使用省略號代替多參數(shù)(參數(shù)類型... 參數(shù)名稱)
* */
private static <T> Map<String, String> validate(T t, Class... groups) {
Validator validator = validatorFactory.getValidator();
Set<ConstraintViolation<T>> validate = validator.validate(t, groups);
if (validate.isEmpty()) {
return Collections.emptyMap();
} else {
/*
* <dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>18.0</version>
</dependency>
* */
LinkedHashMap errors = Maps.newLinkedHashMap();
Iterator<ConstraintViolation<T>> iterator = validate.iterator();
while (iterator.hasNext()) {
ConstraintViolation violation = (ConstraintViolation) iterator.next();
errors.put(violation.getPropertyPath().toString(), violation.getMessage());
}
return errors;
}
}
public static Map<String, String> validatelist(Collection<?> collection) {
//google工具類
Preconditions.checkNotNull(collection);
Iterator<?> iterator = collection.iterator();
Map errors;
do{
if (!iterator.hasNext()){
return Collections.emptyMap();
}
Object next = iterator.next();
errors=validate(next,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> map = BeanValidator.validateobject(param);
/*
* <!--tools-->
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.2.2</version>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.10</version>
</dependency>
* */
if (MapUtils.isNotEmpty(map)) {
throw new ParamException(map.toString());
}
}
}
vo層
package com.permission.vo;
import lombok.Data;
import org.hibernate.validator.constraints.NotBlank;
import org.hibernate.validator.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.List;
/**
* @version:1.0.0
* @author: lironghong
* @date: 2019/4/18 16:36
* @description:
*/
@Data
public class TestVo {
@NotBlank
private String msg;
@NotNull
private Integer id;
@NotEmpty
private List<String> str;
}
控制層測試
@RequestMapping("/validator.json")
@ResponseBody
public JsonData validator(TestVo vo){
log.info("validator");
try {
Map<String, String> validateobject = BeanValidator.validateobject(vo);
if (validateobject != null && validateobject.entrySet().size() > 0){
for (Map.Entry<String,String> entry:validateobject.entrySet()){
log.info("{}->{}",entry.getKey(),entry.getValue());
}
}
} catch (Exception e) {
e.printStackTrace();
}
return JsonData.success("test validator");
}
運行結(jié)果
image.png
image.png