初探Springboot 参数校验

文章目录

  • 前言
  • Bean Validation
    • 注解
  • 实践出真知
    • 异常处理
  • 总结

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。

前言

工作中我们经常会遇到验证字段是否必填,或者字段的值是否在给定范围之内等等类似的问题,如果说是一两个字段的验证还好,验证的字段很多的话,代码就会被大量的if语句包围。通常来说,这些关于字段的判断应该和业务逻辑分开来,可能我们想到的第一个解决方案就是通过AOP,这也能解决我们的问题的。但实际上大可不必,作为一个成熟的语言,Java已经给我们提供解决方案了,那就是Bean Validation

Bean Validation

JSR-303是Java EE 6中的一项子规范,名为Bean Validation,这是Bean Validation 1.0 版本,目前已发展到到3.0版本,名为Jakarta Bean Validation 3.0。Bean Validation提供了一个数据验证的框架,用于对Java Bean中的字段的值进行验证。它使得基本的验证逻辑可以从业务代码中脱离出来,成为一个独立的验证层。

JSR-303的官方参考实现是Hibernate ValidatorHibernate Validator提供了JSR 303规范中所有内置约束的实现,除此之外还有一些附加的约束。

这种验证机制是运行时的,也就是说,在验证之后,如果数据不符合指定的约束,那么会立即返回错误信息。

总之,JSR-303 为Java应用程序提供了一种方便、灵活且强大的数据验证方式。

注解

JSR-303 提供了一系列注解,用于在Java中进行数据校验。这些注解主要用于对实体类的属性进行约束,以确保数据的有效性。

在这里插入图片描述

以下是一些常用的JSR-303 validation注解:

  1. @NotNull:用于对象的校验,确保对象不为null
  2. @NotBlank:验证对象是否不为空,相比@NotNull会去掉首尾空格,对象类型为CharSequence
  3. @NotEmpty: 验证对象(如数组、Collection集合、MapString)是否不为NULL并且长度或者大小不为空
  4. @Size:用于验证对象(如数组、Collection集合、MapString)的长度或大小是否在给定的范围之内。
  5. @Pattern:验证字符串是否匹配指定的正则表达式,null值被认为是有效的格式。
  6. @Email:验证是否符合电子邮件格式。
  7. @Min:验证数字是否大于等于指定值,
  8. @Max:验证数字是否小于等于指定值。
  9. @AssertTrue:验证Boolean对象是否为true。
  10. @AssertFalse:验证Boolean对象是否为false。
  11. @NotBlank:验证CharSequence 对象非null,且长度必须大于0。
  12. @DecimalMin(value):被注解的对象必须是一个数字,其值必须大于等于指定的最小值,对象类型可以为 BigDecimalBigIntegerCharSequence
  13. @DecimalMax:被注解的对象必须是一个数字,其值必须小于等于指定的最大值。
  14. @Digits(integer,fraction):被注解的元素必须是一个数字,其值必须在指定的整数和小数部分的最大位数的范围之内。
  15. @Past:被注解的元素必须是一个过去的日期。
  16. @Future:被注解的元素必须是一个将来的日期。
  17. @FutureOrPresent:被注解的元素必须是现在或将来的一个瞬间、日期或时间。
  18. @PositiveOrZero:被注解的元素必须为正数或零。
  19. @Positive:被注解的元素必须是正数(不包括0)。
  20. @NegativeOrZero:被注解的元素必须为负数或零。
  21. @Negative:被注解的元素必须是负数(不包括0)。
  22. @Null:被注解的元素必须是NULL

Hibernate Validator 附加的约束注解:
Hibernate Validator 8.0.1官方链接 感兴趣的可以去看看。

Hibernate Validator 8.0.1

实践出真知

下面通过代码演示一下Springboot 中字段验证的使用。

1. 引入依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><scope>provided</scope>
</dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId>
</dependency>

2. 创建Bean 用于校验

@Data
public class UserBean {@NotEmptyprivate String username;@Min(value = 18)private Integer age;@Email(message = "邮箱格式不正确")private String email;
}

3. 创建访问接口

接口中要使用 @Validated 或者 @Valid使Bean 验证生效,下一篇文章 @Validated@Valid 之间的区别。

@RestController
@RequestMapping("validation")
public class ValidationController {@GetMapping("user")public UserBean getUserBean(@Validated UserBean userBean) {return userBean;}
}

4. 使用postman进行测试

因为username校验不通过,所以postman响应结果如下,响应结果不够友好,下面会进行改造:

{"timestamp": "2024-02-28T09:15:23.925+00:00","status": 400,"error": "Bad Request","path": "/validation/user"
}

控制台打印结果比较详细:

2024-02-28T17:15:23.918+08:00  WARN 24752 --- [nio-8080-exec-1] .w.s.m.s.DefaultHandlerExceptionResolver : 
Resolved [org.springframework.web.bind.MethodArgumentNotValidException:Validation failed for argument [0] in public site.suncodernote.validation.UserBean site.suncodernote.validation.ValidationController.getUserBean(site.suncodernote.validation.UserBean): [Field error in object 'userBean' on field 'username': rejected value [null]; codes [NotEmpty.userBean.username,NotEmpty.username,NotEmpty.java.lang.String,NotEmpty]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [userBean.username,username]; arguments []; default message [username]]; default message [不能为空]] ]

异常处理

由于默认的校验提示不够友好,无法具体显示是哪个字段出现的问题,下面我们将其简单改造一下。

1. 封装统一响应对象

@Data
public class ResponseResult <T> implements Serializable {private boolean success;/*** 返回处理消息*/private String message;/*** 返回代码*/private Integer code = 0;/*** 返回数据对象 data*/private T result;
}

2. 封装全局异常处理类

@RestControllerAdvice
public class GlobalExceptionHandler {/***  参数校检异常* @param e* @return*/@ExceptionHandler(value = MethodArgumentNotValidException.class)public ResponseResult<?> handle(MethodArgumentNotValidException e) {BindingResult bindingResult = e.getBindingResult();StringJoiner joiner = new StringJoiner(";");for (ObjectError error : bindingResult.getAllErrors()) {// 注解名称String code = error.getCode();String[] codes = error.getCodes();String property = codes[1];property = property.replace(code ,"").replace(".","");String defaultMessage = error.getDefaultMessage();joiner.add(property+defaultMessage);}return handleException(joiner.toString());}private ResponseResult<?> handleException(String msg) {ResponseResult<?> result = new ResponseResult<>();result.setMessage(msg);result.setCode(500);return result;}
}

GlobalExceptionHandler 异常处理类中,为了省事就把字段名和验证失败提示语拼接到一起了。

3. 再次测试

再次测试可以看到在响应结果中得到了我们想要的结果了,至此Springboot参数校验入门就完成了。

总结

Springboot 参数校验在实际工作中用处非常大,本文只是简单介绍一下有哪些注解和简单使用,后续会对Springboot参数校验做一个详细的介绍和使用,感兴趣可以关注一下。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/757434.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

极客早报第3期:罗斯否认插足凯特王妃婚姻;清明放假调休3天;国产伟哥去年销售近13亿

一分钟速览新闻点&#xff01; 每日简报 罗斯否认插足凯特王妃婚姻清明放假调休3天国产伟哥去年销售近13亿男子持台球杆殴打2名女店员被抓今日春分淀粉肠小王子带货日销售额涨超10倍[高中生被打伤下体休学 邯郸通报](https://www.baidu.com/s?wd高中生被打伤下体休学 邯郸通报…

ARM Cortex-R82处理器在压缩SSD场景的应用

ScaleFlux公司宣布在其下一代企业级SSD控制器产品线中采用Arm公司的Cortex-R82处理器。这一决策旨在应对企业环境中对高带宽存储解决方案日益增长的需求&#xff0c;并通过提升数据传输速度和效率来满足市场期待。 Arm Cortex-R82处理器是Arm公司迄今为止性能最强的实时处理器…

STC 51单片机烧录程序遇到一直检测单片机的问题

准备工作 一&#xff0c;需要一个USB-TTL的下载器 &#xff0c;并安装好对应的驱动程序 二、对应的下载软件&#xff0c;stc软件需要官方的软件&#xff08;最好是最新的&#xff0c;个人遇到旧的下载软件出现问题&#xff09; 几种出现一直检测的原因 下载软件图标&#xf…

Unbuntu20.04 git push和pull相关问题

文章目录 Unbuntu20.04 git push和pull使用&#xff11;&#xff0e;下载[Git工具包](https://git-scm.com/downloads)&#xff12;&#xff0e;建立本地仓库&#xff13;&#xff0e;将本地仓库与github远程仓库关联&#xff14;&#xff0e;将本地仓库文件上传到github远程仓…

J4G企业通讯ip电话 sip对讲主机 停车场对讲主机

J4G企业通讯ip电话 sip对讲主机 停车场对讲主机 SV-J4G 是一款企业级彩屏网络电话&#xff0c;具有高清语音&#xff0c;320x240 2.8英寸彩屏&#xff0c;支持千兆以太网&#xff0c;12个SIP账号&#xff0c;支持PoE供电&#xff0c;支持外接EHS无线耳机&#xff0c;三方电话会…

Grok-1:参数量最大的开源大语言模型

Grok-1&#xff1a;参数量最大的开源大语言模型 项目简介 由马斯克领衔的大型模型企业 xAI 正式公布了一项重要动作&#xff1a;开源了一个拥有 3140 亿参数的混合专家模型&#xff08;MoE&#xff09;「Grok-1」&#xff0c;连同其模型权重和网络架构一并公开。 此举将 Gro…

清华大模型ChatGLM3部署初体验

正文共&#xff1a;1555 字 17 图&#xff0c;预估阅读时间&#xff1a;2 分钟 ChatGLM3是智谱AI和清华大学KEG实验室联合发布的对话预训练模型。该项目在GitHub的工程链接为&#xff1a; https://github.com/THUDM/ChatGLM3 在人工智能领域中&#xff0c;类似“3B”、“6B”、…

C++--STL标准库

一.模板 模板是C中泛型编程的基础。一个模板就是一个创建类或函数的蓝图。 生活中常见的模板有: 编写一个比较两个值大小的函数&#xff0c;如果第一个值大于第二个值返回大于0的数字,两个值相等返回0,第一个值小于第二个值返回小于0的数字。 我们可以根据值类型定义多个函数&…

Go语言实战:深入掌握标准库flag的强大用法

Go语言实战&#xff1a;深入掌握标准库flag的强大用法 引言flag库基础命令行参数的基本概念使用flag库定义和解析命令行参数处理非选项命令行参数小结 高级用法自定义Flag的解析命令行参数的分组和嵌套小结 实战技巧组织复杂命令行应用的参数错误处理和用户帮助信息调试命令行应…

php基于人工智能预警突发疾病系统python-flask-django-nodejs

根据现实需要&#xff0c;此系统我们设计出一下功能&#xff0c;主要有以下功能模板。 前台功能&#xff1a;首页、医生、疾病知识、后台管理。 医生功能&#xff1a;首页、个人中心、咨询信息管理、疾病预警管理、高血压管理、糖尿病管理。 用户功能&#xff1a;首页、个人中心…

数据分析能力模型分析与展示

具体内容&#xff1a; 专业素质 专业素质-01 数据处理 能力定义•能通过各种数据处理工具及数据处理方法&#xff0c;对内外部海量数据进行清洗和运用&#xff0c;提供统一数据标准&#xff0c;为业务分析做好数据支持工作。 L1•掌握一…

SinoDB客户端工具dbaccess

类似Oracle的客户端工具sqlplus&#xff0c;Mysql的客户端工具mysql&#xff0c;SinoDB数据库也有自带的命令行客户端工具dbaccess。 dbaccess 识别用户输入&#xff0c;将用户输入的 SQL 语句打包发送给 SinoDB 数据库服务器执行&#xff0c;然后接收服务器的执行结果&#xf…

Leet code 238 除自身以外的数组的乘积

解题思路 以示例1为例 创建两个数组dp&#xff08;统计该位置之的所有乘积&#xff09; bp&#xff08;统计该位置之后的所有乘积&#xff09; 比如 1 2 3 4 3的dp应该等于 1*2 bp应该等于 4 这样 dp* bp就为该位置的答案 分别计算出每个位置前后的乘积然后放入数组 然…

3.leetcode---验证回文串(Java版)

链接: https://leetcode.cn/problems/XltzEq/description/ 给定一个字符串 s &#xff0c;验证 s 是否是 回文串 &#xff0c;只考虑字母和数字字符&#xff0c;可以忽略字母的大小写。 本题中&#xff0c;将空字符串定义为有效的 回文串 。 示例 1: 输入: s “A man, a plan…

2022年安徽省职业院校技能大赛 (高职组)“云计算”赛项样卷

#需要资源或有问题的&#xff0c;可私博主&#xff01;&#xff01;&#xff01; #需要资源或有问题的&#xff0c;可私博主&#xff01;&#xff01;&#xff01; #需要资源或有问题的&#xff0c;可私博主&#xff01;&#xff01;&#xff01; 第一场次&#xff1a;私有云(5…

【Linux】自动化构建工具-make/Makefile

个人主页 &#xff1a; zxctscl 如有转载请先通知 文章目录 1. 前言2. 认识make/Makefile3. 了解make/Makefile原理3.1 依赖关系和依赖方法3.2 make检测的顺序3.3 PHONY:XXX 4. makefile内置符号 1. 前言 在上一篇中已经了解了【Linux】编译器-gcc/g使用&#xff0c;这次来一起…

具有功耗低、触控灵敏度高、抗干扰能力强等功能的单键电容式触控芯片——TS223B,适用于小家电、电子玩具等产品

•应用领域• 适用于小家电、电子玩具、智能物联网等各种触控产品方案。 •功能介绍• 这款推出的单键电容式触控芯片TS223B具有功耗低、触控灵敏度高、抗干扰能力强等众多优势&#xff0c;输出方式包括直接输出、电平翻转输出&#xff0c;并且输出的初始状态可以配置&#xff…

Outlook邮箱后缀是什么?如何改邮箱后缀?

Outlook邮箱后缀可以更改吗&#xff1f;微软有哪些后缀的邮箱&#xff1f; 对于许多刚接触Outlook邮箱的新手来说&#xff0c;了解Outlook邮箱后缀是必不可少的一步。那么&#xff0c;Outlook邮箱后缀究竟是什么呢&#xff1f;接下来&#xff0c;AokSend就来详细探讨一下这个问…

SSD203D高性能HDMI投影仪方案

一、方案描述&#xff1a; SSD203D是高度集成的高性能HDMI投影仪解决方案,主芯片为ARM Cortex A7,dule core,1.2GHz;内置DDR3,1Gb;支持H.264/H.265解码;支持JPEG基线编码;支持2D图形引擎;支持HDMI输出最高可达1920x1080/1920x120030fps ;支持SPI-Nor/Nand Flash;Built-in RTC;…

媒体邀约专访的意义?怎么做

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 媒体邀约专访是指企业、组织或个人主动邀请媒体进行专题访谈的一种公关活动。这种活动对于提升品牌形象、传播信息、增强公众认知度和信任度等方面都有重要作用。以下是媒体邀约专访的一…