Spring Boot 项目参数校验的常见使用场景
可以说几乎所有的应用场景中,参数验证都在编写业务逻辑前完成,严格确保进来的数据是合法且符合要求的。
Java Web 开发领域,也早有较为完善的 Bean Validation 为 Java Bean 验证定义了相应的元数据模型和 API。首先,在项目中引入 web 模块的依赖:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>
Hibernate Validator 是 Bean Validation 的一种实现 . Hibernate Validator 提供了 JSR 303 规范中所有内置 constraint 的实现,以及一些附加的 constraint。如果想了解更多请查看 http://www.hibernate.org/subprojects/validator.html
具体以及常用的 constraint 包含如下:
@Data
public class Validate {// 空和非空检查: @Null、@NotNull、@NotBlank、@NotEmpty@Null(message = "验证是否为 null")private Integer isNull;@NotNull(message = "验证是否不为 null, 但无法查检长度为0的空字符串")private Integer id;@NotBlank(message = "检查字符串是不是为 null,以及去除空格后长度是否大于0")private String name;@NotEmpty(message = "检查是否为 NULL 或者是 EMPTY")private List<String> stringList;// Boolean值检查: @AssertTrue、@AssertFalse@AssertTrue(message = " 验证 Boolean参数是否为 true")private Boolean isTrue;@AssertFalse(message = "验证 Boolean 参数是否为 false ")private Boolean isFalse;// 长度检查: @Size、@Length@Size(min = 1, max = 2, message = "验证(Array,Collection,Map,String)长度是否在给定范围内")private List<Integer> integerList;@Length(min = 8, max = 30, message = "验证字符串长度是否在给定范围内")private String address;// 日期检查: @Future、@FutureOrPresent、@Past、@PastOrPresent@Future(message = "验证日期是否在当前时间之后")private Date futureDate;@FutureOrPresent(message = "验证日期是否为当前时间或之后")private Date futureOrPresentDate;@Past(message = "验证日期是否在当前时间之前")private Date pastDate;@PastOrPresent(message = "验证日期是否为当前时间或之前")private Date pastOrPresentDate;// 其它检查: @Email、@CreditCardNumber、@URL、@Pattern、@ScriptAssert、@UniqueElements@Email(message = "校验是否为正确的邮箱格式")private String email;@CreditCardNumber(message = "校验是否为正确的信用卡号")private String creditCardNumber;@URL(protocol = "http", host = "127.0.0.1", port = 8080, message = "校验是否为正确的URL地址")private String url;@Pattern(regexp = "^1[3|4|5|7|8][0-9]{9}$", message = "正则校验是否为正确的手机号")private String phone;// 对关联对象元素进行递归校验检查@Valid@UniqueElements(message = "校验集合中的元素是否唯一")private List<CalendarEvent> calendarEvent;@Data@ScriptAssert(lang = "javascript", script = "_this.startDate.before(_this.endDate)",message = "通过脚本表达式校验参数")private class CalendarEvent {private Date startDate;private Date endDate;}// 数值检查: @Min、@Max、@Range、@DecimalMin、@DecimalMax、@Digits@Min(value = 0, message = "验证数值是否大于等于指定值")@Max(value = 100, message = "验证数值是否小于等于指定值")@Range(min = 0, max = 100, message = "验证数值是否在指定值区间范围内")private Integer score;@DecimalMin(value = "10.01", inclusive = false, message = "验证数值是否大于等于指定值")@DecimalMax(value = "199.99", message = "验证数值是否小于等于指定值")@Digits(integer = 3, fraction = 2, message = "限制整数位最多为3,小数位最多为2")private BigDecimal money;}
常见的前后端分离开发模式,数据通信通常以 JSON 为主。针对 POST 和 PUT 请求,一般通过新建域(对象)模型来进行数据绑定和校验,constraint 通常附加在这些域模型的字段上(如上):
/*** Valid注解标明要对参数对象进行数据校验*/@PutMapping@PostMappingpublic Map<String, Object> test01(@RequestBody @Valid Validate validate, BindingResult bindingResult) {Map<String, Object> map = new HashMap<>(4);if (bindingResult.hasErrors()) {String errorMsg = bindingResult.getFieldErrors().stream().map(FieldError::getDefaultMessage).collect(Collectors.joining(","));map.put("errorMsg", errorMsg);}map.put("params", validate.toString());return map;}
此外,对于 GET 和 DELETE 请求,参数通常为 key1=value1&key2=value2
这种形式。默认情况下,Hibernate Validator 只能对 Object 属性进行校验,并不能对单个参数进行校验,Spring 在此基础上进行了扩展,通过配置 MethodValidationPostProcessor 处理器,可以实现对方法参数的拦截校验。
@Configuration
public class ValidateConfig {/*** 配置MethodValidationPostProcessor拦截器,以实现对方法参数的校验*/@Beanpublic MethodValidationPostProcessor methodValidationPostProcessor() {return new MethodValidationPostProcessor();}}
注意,要在 Controller 类上明确标明 @Validated
:
@Validated
@RestController
@RequestMapping("validate")
public class ValidateController {@GetMapping@DeleteMappingpublic Map<String, Object> test02(@NotNull(message = "id不能为空") @Range(min = 1, max = 100, message = "id最小为1最大为100") Integer id,@NotBlank(message = "email不能为空") @Email(message = "邮箱格式错误") String email,@ModelAttribute @Valid Validate validate) {Map<String, Object> map = new HashMap<>(4);map.put("id", id);map.put("email", email);map.put("params", validate.toString());return map;}}
上述这种形式的参数要是校验失败,错误提示明显并不友好,通过捕获此类异常就可以解决,这里就不再介绍了。
参考链接
JSR 303 - Bean Validation 介绍及最佳实践
SpringBoot-服务端参数验证-JSR-303验证框架
示例源码
欢迎关注我的个人公众号:超级码里奥
如果这对您有帮助,欢迎点赞和分享,转载请注明出处
Spring Boot 项目参数校验的常见使用场景相关推荐
- spring boot 项目 前台向后台传递时间参数,插入到数据库中时间会少一天
spring boot 项目 前台向后台传递时间参数,插入到数据库中时间会少一天 分析: 解决办法 分析: 经过测试,时间从前台传到后台数据是一样的,说明是后台向数据库传递过程中出现了问题 解决办法 ...
- 后端开发实践:Spring Boot项目模板
点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达今日推荐:2020年7月程序员工资统计,平均14357元,又跌了,扎心个人原创100W+访问量博客:点击前往,查看更多 作者 ...
- 后端开发实践:Spring Boot项目模板,拿去用吧!
点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:干掉 Navicat:这个 IDEA 的兄弟真香!个人原创100W+访问量博客:点击前往,查看更多 作者:无知者 ...
- STS创建Spring Boot项目实战(Rest接口、数据库、用户认证、分布式Token JWT、Redis操作、日志和统一异常处理)
STS创建Spring Boot项目实战(Rest接口.数据库.用户认证.分布式Token JWT.Redis操作.日志和统一异常处理) 1.项目创建 1.新建工程 2.选择打包方式,这边可以选择为打 ...
- 快速上手 Spring Boot 项目开发
1. 从零开始 Spring Boot 工程 Spring Boot 可以快速构建基于 Spring 框架的 JavaWeb 应用,快速整合包括视图层.MVC架构以及持久化层在内的各种框架,不需 ...
- Vue + Spring Boot 项目实战(十五):动态加载后台菜单
重要链接: 「系列文章目录」 「项目源码(GitHub)」 本篇目录 前言 一.后端实现 1.表设计 2.pojo 3.菜单查询接口(树结构查询) 二.前端实现 1.后台页面设计 2.数据处理 3.添 ...
- Spring Boot项目学习之通用权限管理项目01
权限管理系统是一个十分常见的系统,在这个系统中是基于角色访问控制的,用户是通过角色与权限进行关联.换句话说,就是一个用户拥有若干个角色,每一个角色拥有若干权限,这样就可以形成一个关系模型:用户-角色- ...
- Vue + Spring Boot 项目实战(二十一):缓存的应用
重要链接: 「系列文章目录」 「项目源码(GitHub)」 本篇目录 前言 一.缓存:工程思想的产物 二.Web 中的缓存 1.缓存的工作模式 2.缓存的常见问题 三.缓存应用实战 1.Redis 与 ...
- 后端开发实践——Spring Boot项目模板
在我的工作中,我从零开始搭建了不少软件项目,其中包含了基础代码框架和持续集成基础设施等,这些内容在敏捷开发中通常被称为"第0个迭代"要做的事情.但是,当项目运行了一段时间之后再来反 ...
- 后端开发实践系列——Spring Boot项目模板
在我的工作中,我从零开始搭建了不少软件项目,其中包含了基础代码框架和持续集成基础设施等,这些内容在敏捷开发中通常被称为"第0个迭代"要做的事情.但是,当项目运行了一段时间之后再来反 ...
最新文章
- R语言_基本数据管理
- Android Google Play app signing 最终完美解决方式
- 【机器视觉】 dev_update_pc算子
- 详解ISA2006三种客户端
- 送书 | 生物信息学习的一点体会
- .NET 开源的免费午餐结束了?
- 阿里、字节年薪百万的测开专家,都在关注哪些前沿技术
- WinRAR4.0注册码
- 离散数学 06.04 子群及其陪集
- 蓝色简洁的企业cms网站权限后台管理模板——后台
- sprintf,snprintf的用法(可以作为linux中itoa函数的补充)
- 定义一个图形抽象类,完成三角形、圆形、矩形的周长和面积计算
- telnet 和 ping的区别
- CGLIb 创建代理
- 关于硬盘分区合并的事
- mysql使用group by查询报错SELECT list is not in GROUP BY clause and contains nonaggregated column.
- K-Means(K均值聚类)原理及代码实现
- 基于神经网络的房屋价格预测
- Android动态广播添加权限
- Cinema 4D R20 Essential Training: VFX Cinema 4D R20基本训练:视觉特效 Lynda课程中文字幕
热门文章
- TCR-T细胞治疗最新研究进展(2021年2月)
- 2021年的4个开源对象存储平台
- 永久删除计算机硬盘中数据的快捷键,教你彻底删除硬盘中的数据方法
- 《互联网DSP广告揭秘——精准投放与高效转化之道》一一 1.8 DMP数据管理平台 ...
- dexpathlist.java_java.lang.ClassNotFoundException: Didn't find class xxx on path: DexPathList
- UE 4.13 3D Widget使用
- OpenCV+Mediapipe人物动作捕捉与Unity引擎的结合
- 网络安全等级保护行业政策汇总
- 2022-2028年中国淄博房地产行业市场发展潜力及投资策略研究报告
- 入坑Java_入坑Java的自学之路