參數(shù)校驗之validator工具類封裝

為什么要使用Bean Validation?

當我們實現(xiàn)某個接口時,都需要對入?yún)?shù)進行校驗.

什么是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相關依賴

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

運行結果

image.png

image.png
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容