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());
} } }
我们对抛出的异常进行了全局捕获
同样,我们需要标志校验规则
测试方法:
运行结果:
springmvc、springboot 参数校验的更多相关文章
- 补习系列(4)-springboot 参数校验详解
目录 目标 一.PathVariable 校验 二.方法参数校验 三.表单对象校验 四.RequestBody 校验 五.自定义校验规则 六.异常拦截器 参考文档 目标 对于几种常见的入参方式,了解如 ...
- springboot 参数校验详解
https://www.jianshu.com/p/89a675b7c900 在日常开发写rest接口时,接口参数校验这一部分是必须的,但是如果全部用代码去做,显得十分麻烦,spring也提供了这部分 ...
- SpringBoot 参数校验的方法
Introduction 有参数传递的地方都少不了参数校验.在web开发中,前端的参数校验是为了用户体验,后端的参数校验是为了安全.试想一下,如果在controller层中没有经过任何校验的参数通过s ...
- 实用———springmvc接收参数校验
https://www.cnblogs.com/funyoung/p/8670550.html https://www.cnblogs.com/monkeydai/p/10068547.html He ...
- SpringBoot 参数校验
一.添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...
- springboot参数校验
为了能够进行嵌套验证,必须手动在Item实体的props字段上明确指出这个字段里面的实体也要进行验证.由于@Validated不能用在成员属性(字段)上,但是@Valid能加在成员属性(字段)上,而且 ...
- SpringMVC参数校验,包括JavaBean和基本类型的校验
该示例项目使用SpringBoot,添加web和aop依赖. SpringMVC最常用的校验是对一个javaBean的校验,默认使用hibernate-validator校验框架.而网上对校验单个参数 ...
- SpringMVC参数校验(针对`@RequestBody`返回`400`)
SpringMVC参数校验(针对@RequestBody返回400) 前言 习惯别人帮忙做事的结果是自己不会做事了.一直以来,spring帮我解决了程序运行中的各种问题,我只要关心我的业务逻辑,设计好 ...
- springboot学习-jdbc操作数据库--yml注意事项--controller接受参数以及参数校验--异常统一管理以及aop的使用---整合mybatis---swagger2构建api文档---jpa访问数据库及page进行分页---整合redis---定时任务
springboot学习-jdbc操作数据库--yml注意事项--controller接受参数以及参数校验-- 异常统一管理以及aop的使用---整合mybatis---swagger2构建api文档 ...
随机推荐
- ECMAScript基本语法——⑤运算符 三元运算符
?: 简化ifelse的操作
- ipa文件信息检查工具
项目地址:https://github.com/ryjwinner/softwares/raw/master/iOS-checkIPA.jar 项目简介: 针对近期大量iOS app需要签名,但多家签 ...
- Python入门11 —— 基本数据类型的操作
一:数字类型:int.float字类型 1.操作: 比较运算:int与float之间是可以比较大小 数学运算:+-*/,int与float之间也可以进行数学运算 print(10 > 3.1) ...
- MySql 中IFNULL、ISNULL、NULLIF用法(数据库判空)
来源:http://blog.csdn.net/a466350665/article/details/52994761 http://blog.csdn.net/xingyu0806/article/ ...
- ubuntu set up 3 - cuda
https://www.pugetsystems.com/labs/hpc/How-to-install-CUDA-9-2-on-Ubuntu-18-04-1184/ How to install C ...
- C#继承是个啥
继承: 字面意思就是继承 如地主老王有500亩地,老王的儿子小王可以种这五百亩地可以随便拿这五百亩地上面的任何东西 如Controller 你要用从一个controller调用另一个controlle ...
- 一步步教你如何在Ubuntu虚拟机中安装QEMU并模拟模拟arm 开发环境(一)uImage u-boot(转)
初次接触qemu是因为工作的需要,有时候下了班,可能需要在家研究一些东西,因为博主用到arm环境,这时候博主比较小气,不愿花钱买开发板,当然博主在这里给大家的建议是,如果要真正学懂arm构架的相关知识 ...
- R Tidyverse dplyr包学习笔记2
Tidyverse 学习笔记 1.gapminder 我理解的gapminder应该是一个内置的数据集 加载之后使用 > # Load the gapminder package > li ...
- cc.progressFromTo cc.progressTo(action 在duration中ProgressTimer的Percentage变化)
let progressTimer= new cc.ProgressTimer(new cc.Sprite(fileName));this.addChild(progressTimer);progre ...
- Python 排序---sort与sorted学习(这是摘录别人的资源总结,自己可临摹学习)
第一种:内建方法sort() 可以直接对列表进行排序 用法: list.sort(func=None, key=None, reverse=False(or True)) 对于reverse这个boo ...