zoukankan      html  css  js  c++  java
  • springmvc、springboot 参数校验

    参数校验在项目中是必不可少的,不仅前端需要校验,为了程序的可靠性,后端也需要对参数进行有效性的校验。下面将介绍在springmvc或springboot项目中参数校验的方法

    准备工作:

    引入校验需要用到的依赖

     

     

     首先放上我们的测试对象

     

    方法一、全部使用注解的方式进行校验

    可以看到,我们在测试对象中加上了@NotBlank和@NotEmpty注解,表示该字段需要进行校验,下面我们进行测试

    我们在需要校验的对象前面加上@Valid注解

    测试方法:

     

    运行结果:

    这样我们就完成了参数校验,并且获取到了错误的信息。但是需要注意的是,我们想要拿到错误信息的时候还需要用到BindingResult对象,如果项目中有多处需要进行校验的话,BindResult参数用到得特别频繁,导致代码看起来很多余,所以我们使用第二种方法,自定义参数校验。

    方法二、自定义参数校验方法

    自定义校验类的代码如下

    package com.me.util;

    import com.google.common.base.Preconditions;
    import com.google.common.collect.Lists;
    import com.google.common.collect.Maps;
    import com.me.exception.ParamException;
    import org.apache.commons.collections.MapUtils;

    import javax.validation.ConstraintViolation;
    import javax.validation.Validation;
    import javax.validation.Validator;
    import javax.validation.ValidatorFactory;
    import java.util.*;

    public class BeanValidator {
    // Validator工厂
    private static ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory();

    // Map<String,String> 中 key表示错误的字段,value表示错误信息

    /**
    * 校验单个对象
    *
    * @param t
    * @param groups
    * @param <T>
    * @return
    */
    public static <T> Map<String, String> validate(T t, Class... groups) {
    Validator validator = validatorFactory.getValidator();
    // 传入参数,并获取校验结果
    Set validatorErrors = validator.validate(t, groups);
    // 若校验为空,说明校验通过,返回空集合
    if (validatorErrors.isEmpty()) {
    return Collections.emptyMap();
    } else {
    LinkedHashMap<String, String> errors = Maps.newLinkedHashMap();
    // 对校验错误信息进行遍历
    Iterator iterator = validatorErrors.iterator();
    while (iterator.hasNext()) {
    ConstraintViolation violation = (ConstraintViolation) iterator.next();
    // 放入key,value
    errors.put(violation.getPropertyPath().toString(), violation.getMessage());
    }
    return errors;
    }
    }

    /**
    * 校验多个对象
    *
    * @param collection
    * @return
    */
    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;
    }

    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> errors = validateObject(param);
    if (MapUtils.isNotEmpty(errors)) {
    throw new ParamException(errors.toString());
    }

    }


    }

    我们对抛出的异常进行了全局捕获

    同样,我们需要标志校验规则

     

    测试方法:

    运行结果:

     

  • 相关阅读:
    前端展示(四)
    小谢第66问:页面关闭鼠标光标
    小谢第64问:nuxt项目中增加百度分析统计
    js 判断当前是手机还是电脑
    布谷鸟自定义教程
    vs code常用插件及配置
    小程序几件小事儿
    删除 json 数据中的某一项
    小程序图片预览
    小程序 navigator 取消点击效果
  • 原文地址:https://www.cnblogs.com/devise/p/9974660.html
Copyright © 2011-2022 走看看