参数校验在项目中是必不可少的,不仅前端需要校验,为了程序的可靠性,后端也需要对参数进行有效性的校验。下面将介绍在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());
} } }

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

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

测试方法:

运行结果:

springmvc、springboot 参数校验的更多相关文章

  1. 补习系列(4)-springboot 参数校验详解

    目录 目标 一.PathVariable 校验 二.方法参数校验 三.表单对象校验 四.RequestBody 校验 五.自定义校验规则 六.异常拦截器 参考文档 目标 对于几种常见的入参方式,了解如 ...

  2. springboot 参数校验详解

    https://www.jianshu.com/p/89a675b7c900 在日常开发写rest接口时,接口参数校验这一部分是必须的,但是如果全部用代码去做,显得十分麻烦,spring也提供了这部分 ...

  3. SpringBoot 参数校验的方法

    Introduction 有参数传递的地方都少不了参数校验.在web开发中,前端的参数校验是为了用户体验,后端的参数校验是为了安全.试想一下,如果在controller层中没有经过任何校验的参数通过s ...

  4. 实用———springmvc接收参数校验

    https://www.cnblogs.com/funyoung/p/8670550.html https://www.cnblogs.com/monkeydai/p/10068547.html He ...

  5. SpringBoot 参数校验

    一.添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...

  6. springboot参数校验

    为了能够进行嵌套验证,必须手动在Item实体的props字段上明确指出这个字段里面的实体也要进行验证.由于@Validated不能用在成员属性(字段)上,但是@Valid能加在成员属性(字段)上,而且 ...

  7. SpringMVC参数校验,包括JavaBean和基本类型的校验

    该示例项目使用SpringBoot,添加web和aop依赖. SpringMVC最常用的校验是对一个javaBean的校验,默认使用hibernate-validator校验框架.而网上对校验单个参数 ...

  8. SpringMVC参数校验(针对`@RequestBody`返回`400`)

    SpringMVC参数校验(针对@RequestBody返回400) 前言 习惯别人帮忙做事的结果是自己不会做事了.一直以来,spring帮我解决了程序运行中的各种问题,我只要关心我的业务逻辑,设计好 ...

  9. springboot学习-jdbc操作数据库--yml注意事项--controller接受参数以及参数校验--异常统一管理以及aop的使用---整合mybatis---swagger2构建api文档---jpa访问数据库及page进行分页---整合redis---定时任务

    springboot学习-jdbc操作数据库--yml注意事项--controller接受参数以及参数校验-- 异常统一管理以及aop的使用---整合mybatis---swagger2构建api文档 ...

随机推荐

  1. [POI2008] PLA-Postering - 单调栈

    给你 \(n\) 个相连的矩形建筑,让你用最少海报把他们覆盖掉,海报不能重叠,也不可以高出被覆盖的矩形. Solution 考虑维护一个单调递增的栈,每次插入时弹掉所有比自己高的,如果自己和末端一样高 ...

  2. PP: Taking the human out of the loop: A review of bayesian optimization

    Problem: Design problem parameters consist of the search space of your model. Scientists design expe ...

  3. 0级搭建类003-CentOS Linux安装 (CentOS 7)公开

    项目文档引子系列是根据项目原型,制作的测试实验文档,目的是为了提升项目过程中的实际动手能力,打造精品文档AskScuti. 项目文档引子系列目前不对外发布,仅作为博客记录.如学员在实际工作过程中需提前 ...

  4. 翻转引起 cocos studio 引擎与cocos2d 代码相同坐标显示不同

    使用setFlippedX后,又改变锚点为1.此时代码中坐标需要相对于cocos studio 中增加它本身的width,因为(0.5,0.5)是相对于自己中点的翻转,不变坐标.而(1,0.5)是相对 ...

  5. 数据库SQL练习(一):数据查询

    先创建以下3张基本表 1.学生信息表(Student): 2.课程表(Course): 3.成绩表(Score): 4. 将下列数据输入各个表中 建表SQL: CREATE DATABASE Stud ...

  6. 5G将至,4G降速:是谣言还是真相?

    畅用移动智能终端设备,早已成为大众日常生活中的一部分.卫报专栏作家伯克曼提到,"据估计,70%的人会抱着手机或iPad刷资讯入睡."当移动智能终端变得如此重要时,与之息息相关的网络 ...

  7. linux - mysql:安装mysql

    安装环境 系统是 centos6.5 1.下载 下载地址:http://dev.mysql.com/downloads/mysql/5.6.html#downloads 下载版本:我这里选择的5.6. ...

  8. npm 模块开发调试技巧之最优方案npm link

    在我们平时写项目中,当我们需要新开发或修改的 npm 模块时,如何在本地项目中调试呢? 本地项目路径:G:\npm\project 开发的模块路径:G:\npm\model 方法一: 在cmd命令窗口 ...

  9. Java大全-吐血整理

    gqzdev

  10. CI系列之配置sonar

    基于GO项目 1.在jenkins新建sonar任务,设置2个变量用于接收代码分支和pipline的workspace[两个变量的作用在CI之Jenkinsfile中会讲到] A.添加构建参数 B.选 ...