基礎Hibernator-Validator不介紹,自行百度
先獻上樓主之前的service層代碼,是不是很無奈,這麼多類似的判斷;頭痛!!!
解放雙手Hibernator-Validator JSR303校驗
public ObjectRestResponse<AgentTrustor> add(@RequestBody @Validated(AgentTrustor.ID.class) AgentTrustor agentTrustor) throws BaseException
很多人controller是不是這麼用的!捕獲異常傳回前端;low
但這個解決不了我service的if,雖然jdk8也有if的判斷方法,但是不爽;
然後新代碼來了:直接複制到自己的項目裡面:這個校驗工具支援springboot1.4.x以後版本,超過springboot2.0,會更加簡單;不過這樣寫也很好了!
/**
* @Author Cloud Bai
* @create 2019/10/28 1:08
* @description TODO
*/
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.*;
import java.util.stream.Collectors;
public class BeanValidator {
private static ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory();
public static <T> Map<String, String> validate(T t, Class... groups) {
Validator validator = validatorFactory.getValidator();
Set validateResult = validator.validate(t, groups);
if (validateResult.isEmpty()) {
return Collections.emptyMap();
} else {
LinkedHashMap errors = Maps.newLinkedHashMap();
Iterator iterator = validateResult.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) {
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;
}
/**
* 驗證入口
* @param first
* @param objects
* @return
*/
public static String validateObject(Object first, Object... objects) {
Map<String,String> map=new HashMap<>();
if (objects != null && objects.length > 0) {
map=validateList(Lists.asList(first, objects));
return mapToString(map);
} else if (first==null){
return "參數不能為空";
// throw new GlobalException(ApiResult.PARAM_NOT_NULL, null);//部落客自己的異常類
}else {
map=validate(first, new Class[0]);
return mapToString(map);
}
}
private static String mapToString(Map<String,String> map){
String mapAsString = map.keySet().stream()
.map(key -> key + map.get(key))
.collect(Collectors.joining(", "));
return mapAsString;
}
}
測試使用:任意地方,将你要校驗的類方進去就行啦;最下面還有一個工具類!!!
@RequestMapping("/validate")
public ApiResponse validate(@RequestBody BaseUser baseUser) {
String map = BeanValidator.validateObject(baseUser);//這裡放進去校驗
if (!StringUtils.isEmpty(map)){
return ApiResponse.getResponse(map);//拿到jsr303的校驗,你也可以是異常
}
else {
return ApiResponse.getDefaultResponse();
}
}
package com.sbs.common.dto;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import java.util.*;
/**
* @Author Cloud Bai
* @create 2019/11/12 17:03
* @description 基礎校驗
*/
public class ValidateUtil {
public static <T> List<Map<String, String>> validate(T t) {
//定義傳回錯誤List
List<Map<String, String>> errList = new ArrayList<Map<String, String>>();
//定義錯誤map
Map<String, String> errorMap;
//校驗工廠
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
//擷取校驗工具(校驗執行者)
Validator validator = factory.getValidator();
//執行校驗,拿到錯誤集合
Set<ConstraintViolation<T>> errorSet = validator.validate(t);
//循環拿到錯誤資訊放到errList并傳回
for (ConstraintViolation<T> c : errorSet) {
errorMap = new HashMap<>();
errorMap.put("field", c.getPropertyPath().toString()); //擷取發生錯誤的字典名稱
errorMap.put("msg", c.getMessage()); //擷取校驗資訊
errList.add(errorMap);
}
//傳回調用方
return errList;
}
}