天天看點

(推薦)SpringBoot-JSR303-Hibernator-Validator但這個解決不了我service的if,雖然jdk8也有if的判斷方法,但是不爽;

基礎Hibernator-Validator不介紹,自行百度

先獻上樓主之前的service層代碼,是不是很無奈,這麼多類似的判斷;頭痛!!!

(推薦)SpringBoot-JSR303-Hibernator-Validator但這個解決不了我service的if,雖然jdk8也有if的判斷方法,但是不爽;

解放雙手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;
    }
}