美文网首页
参数校验之validator工具类封装

参数校验之validator工具类封装

作者: return997 | 来源:发表于2019-04-18 17:24 被阅读0次

为什么要使用Bean Validation?

当我们实现某个接口时,都需要对入参数进行校验.

什么是bean validator?

bean validator是一个配置注解来验证参数的框架,它包含两部分Bean Validator api和Hibernate Validator.

  • Bean Validation API是Java定义的一个验证参数的规范。
  • Hibernate Validator是Bean Validation API的一个实现。

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>

工具类开发

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使用省略号代替多参数(参数类型... 参数名称)
     * */
    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

相关文章

网友评论

      本文标题:参数校验之validator工具类封装

      本文链接:https://www.haomeiwen.com/subject/budwwqtx.html