可以说几乎所有的应用场景中,参数验证都在编写业务逻辑前完成,严格确保进来的数据是合法且符合要求的。

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 项目参数校验的常见使用场景相关推荐

  1. spring boot 项目 前台向后台传递时间参数,插入到数据库中时间会少一天

    spring boot 项目 前台向后台传递时间参数,插入到数据库中时间会少一天 分析: 解决办法 分析: 经过测试,时间从前台传到后台数据是一样的,说明是后台向数据库传递过程中出现了问题 解决办法 ...

  2. 后端开发实践:Spring Boot项目模板

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达今日推荐:2020年7月程序员工资统计,平均14357元,又跌了,扎心个人原创100W+访问量博客:点击前往,查看更多 作者 ...

  3. 后端开发实践:Spring Boot项目模板,拿去用吧!

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:干掉 Navicat:这个 IDEA 的兄弟真香!个人原创100W+访问量博客:点击前往,查看更多 作者:无知者 ...

  4. STS创建Spring Boot项目实战(Rest接口、数据库、用户认证、分布式Token JWT、Redis操作、日志和统一异常处理)

    STS创建Spring Boot项目实战(Rest接口.数据库.用户认证.分布式Token JWT.Redis操作.日志和统一异常处理) 1.项目创建 1.新建工程 2.选择打包方式,这边可以选择为打 ...

  5. 快速上手 Spring Boot 项目开发

    1. 从零开始 Spring Boot 工程    Spring Boot 可以快速构建基于 Spring 框架的 JavaWeb 应用,快速整合包括视图层.MVC架构以及持久化层在内的各种框架,不需 ...

  6. Vue + Spring Boot 项目实战(十五):动态加载后台菜单

    重要链接: 「系列文章目录」 「项目源码(GitHub)」 本篇目录 前言 一.后端实现 1.表设计 2.pojo 3.菜单查询接口(树结构查询) 二.前端实现 1.后台页面设计 2.数据处理 3.添 ...

  7. Spring Boot项目学习之通用权限管理项目01

    权限管理系统是一个十分常见的系统,在这个系统中是基于角色访问控制的,用户是通过角色与权限进行关联.换句话说,就是一个用户拥有若干个角色,每一个角色拥有若干权限,这样就可以形成一个关系模型:用户-角色- ...

  8. Vue + Spring Boot 项目实战(二十一):缓存的应用

    重要链接: 「系列文章目录」 「项目源码(GitHub)」 本篇目录 前言 一.缓存:工程思想的产物 二.Web 中的缓存 1.缓存的工作模式 2.缓存的常见问题 三.缓存应用实战 1.Redis 与 ...

  9. 后端开发实践——Spring Boot项目模板

    在我的工作中,我从零开始搭建了不少软件项目,其中包含了基础代码框架和持续集成基础设施等,这些内容在敏捷开发中通常被称为"第0个迭代"要做的事情.但是,当项目运行了一段时间之后再来反 ...

  10. 后端开发实践系列——Spring Boot项目模板

    在我的工作中,我从零开始搭建了不少软件项目,其中包含了基础代码框架和持续集成基础设施等,这些内容在敏捷开发中通常被称为"第0个迭代"要做的事情.但是,当项目运行了一段时间之后再来反 ...

最新文章

  1. R语言_基本数据管理
  2. Android Google Play app signing 最终完美解决方式
  3. 【机器视觉】 dev_update_pc算子
  4. 详解ISA2006三种客户端
  5. 送书 | 生物信息学习的一点体会
  6. .NET 开源的免费午餐结束了?
  7. 阿里、字节年薪百万的测开专家,都在关注哪些前沿技术
  8. WinRAR4.0注册码
  9. 离散数学 06.04 子群及其陪集
  10. 蓝色简洁的企业cms网站权限后台管理模板——后台
  11. sprintf,snprintf的用法(可以作为linux中itoa函数的补充)
  12. 定义一个图形抽象类,完成三角形、圆形、矩形的周长和面积计算
  13. telnet 和 ping的区别
  14. CGLIb 创建代理
  15. 关于硬盘分区合并的事
  16. mysql使用group by查询报错SELECT list is not in GROUP BY clause and contains nonaggregated column.
  17. K-Means(K均值聚类)原理及代码实现
  18. 基于神经网络的房屋价格预测
  19. Android动态广播添加权限
  20. Cinema 4D R20 Essential Training: VFX Cinema 4D R20基本训练:视觉特效 Lynda课程中文字幕

热门文章

  1. TCR-T细胞治疗最新研究进展(2021年2月)
  2. 2021年的4个开源对象存储平台
  3. 永久删除计算机硬盘中数据的快捷键,教你彻底删除硬盘中的数据方法
  4. 《互联网DSP广告揭秘——精准投放与高效转化之道》一一 1.8 DMP数据管理平台 ...
  5. dexpathlist.java_java.lang.ClassNotFoundException: Didn't find class xxx on path: DexPathList
  6. UE 4.13 3D Widget使用
  7. OpenCV+Mediapipe人物动作捕捉与Unity引擎的结合
  8. 网络安全等级保护行业政策汇总
  9. 2022-2028年中国淄博房地产行业市场发展潜力及投资策略研究报告
  10. 入坑Java_入坑Java的自学之路