初探Springboot 参数校验

news2025/1/16 5:46:58

文章目录

  • 前言
  • 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 {

    
    @NotEmpty
    private 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.User
 Bean): [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.coloradmin.cn/o/1530637.html

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

相关文章

网络工程师练习题2

网络工程师 将专用IP地址转换为公用IP地址的技术是&#xff08;&#xff09;。 A.ARPB.DHCPC.UTMD.NAT 【答案】D 【解析】概念题&#xff0c;NAT技术将源地址从内部专用地址转换成可以在外部Internet上路由的全局IP地址。 R1、R2是一个自治系统中采用RIP路由协议的两个相…

微软AI系列 C#中实现相似度计算涉及到加载图像、使用预训练的模型提取特征以及计算相似度

在C#中实现相似度计算涉及到加载图像、使用预训练的模型提取特征以及计算相似度。你可以使用.NET中的深度学习库如TensorFlow.NET来加载预训练模型&#xff0c;提取特征&#xff0c;并进行相似度计算。 以下是一个使用TensorFlow.NET的示例&#xff1a; using System; using …

十二 超级数据查看器 讲解稿 详情7 其他功能

十二 超级数据查看器 讲解稿 详情7 其他功能 点击此处 以新页面 打开B站 播放当前教学视频 点击访问app下载页面 百度手机助手 下载地址 ​ 讲解稿全文&#xff1a; 其他操作&#xff0c;主要用来完成替换和批量修改&#xff0c; 这里&#xff0c;我们想给成语字段增…

HarmonyOS系统开发ArkTS常用组件文本及参数(五)

目录 一、Text组件 1、Text组件案例 二、Text组件参数 1、string字符串类型 2、Resources类型 2.1、resources中内容配置 base/element/string.json 中的内容 zh_US/element/string.json 中的内容 es_US/element/string.json 中的内容 2.2、环境适配 适配英文 适配中文…

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

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

云服务器2核4g能支持多少人同时访问?腾讯云和阿里云PK

腾讯云轻量应用服务器2核4G5M配置性能测评&#xff0c;腾讯云轻量2核4G5M带宽服务器支持多少人在线访问&#xff1f;并发数10&#xff0c;支持每天5000IP人数访问&#xff0c;腾讯云百科txybk.com整理2核4G服务器支持多少人同时在线&#xff1f;并发数测试、CPU性能、内存性能、…

【HMM】Hidden Markov Model

文章目录 1 HMM 的概念1.1 引入1.1.1 Markov property1.1.2 Markov chain1.1.3 一阶离散马尔可夫模型 1.2 HMM 的定义1.3 观测序列的生成过程1.4 HMM 的 3 个基本问题 2 三个基本问题的解法2.1 概率计算算法2.1.1 直接计算法2.1.2 向前算法2.1.3 向后算法2.1.4 一些概率与期望值…

基于springboot+vue的智慧生活商城系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

反射与串扰

一、 反射 原因&#xff1a;由于AD采集端与传感器端和双绞线的阻抗不匹配而导致待测信号在AD处反射叠加&#xff1b; 解决办法&#xff1a;1、对AD采集端和炮榄传感器端进行合适于炮榄的阻抗匹配。具体来说可 以在AD采集端并联一个匹配电阻&#xff0c;电阻的阻值需要和传输线…

免费录音软件大集合,轻松录制高品质音频

“有没有免费的录音软件推荐呀&#xff1f;最近我在制作一个关于环境保护的宣传片&#xff0c;需要录制一些大自然的声音。但是我发现自己并不擅长录音&#xff0c;甚至不知道如何开始。希望有人能推荐一些免费且易用的录音软件&#xff0c;感激不尽&#xff01;” 在当今信息…

保护王国的钥匙:探索特权访问管理 (PAM) 的深度

在零信任架构的范例中&#xff0c;特权访问管理&#xff08;PAM&#xff09;正在成为网络安全策略的关键组成部分&#xff0c;旨在控制和监控组织内的特权访问。本文深入探讨了 PAM 在现代网络安全中的关键作用&#xff0c;探讨了其原理、实施策略以及特权访问的演变格局。 什么…

Czkawka重复文件查找工具

分享一款重复文件查找工具&#xff0c;Czkawka是一款简单、快速且免费的用于查找重复项、空文件夹、相似图像等的多功能的应用程序。可以从计算机中删除不必要的文件。 软件特色&#xff1a; 用内存安全的 Rust 编写&#xff0c;惊人的快 – 由于使用了或多或少的高级算法和多线…

【Java常用API】正则表达式练习

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【Java】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏 …

【Auth Proxy】为你的 Web 服务上把锁

Auth Proxy 一个极简的用于 Web 服务鉴权的反向代理服务 极其简约的 UI对你的真实服务无任何侵入性支持容器部署&#xff0c;Docker Image 优化到不能再小&#xff08;不到 9MB&#xff09;GitHub&#xff1a;https://github.com/wengchaoxi/auth-proxy 效果 我在 http://lo…

一文读懂NAS存储:从零开始的存储“神器”

目录 一、初识NAS&#xff1a;它是何方神圣&#xff1f; 二、NAS存储的特点 三、NAS的工作原理简述 四、NAS的应用场景介绍 五、NAS与其他存储的区别 今天我们要揭开神秘面纱的是一个名为“NAS”的存储设备&#xff0c;它就像是你家中的私人云端资料库&#xff0c;帮你轻松…

【AIGC】全球首位AI软件工程师 Devin,程序员们真的会失业吗

文章目录 强烈推荐推荐一&#xff1a;人工智能网站推荐二&#xff1a;人工智能工具 Devin的诞生Devin的特点和能力Devin如何工作&#xff1f;程序员会彻底消失吗&#xff1f;总结强烈推荐推荐一&#xff1a;人工智能网站推荐二&#xff1a;人工智能工具 专栏集锦写在最后 强烈推…

【论文速读】| 增强静态分析以实现实用漏洞检测:一种集成大语言模型的方法

本次分享论文为&#xff1a;Enhancing Static Analysis for Practical Bug Detection: An LLM-Integrated Approach 基本信息 原文作者&#xff1a;Haonan Li, Yu Hao, Yizhuo Zhai, Zhiyun Qian 作者单位&#xff1a;加州大学河滨分校 关键词&#xff1a;静态分析、错误检测…

Linux hook系统调用使你文件无法删除

文章目录 前言一、什么是hook技术二、Linux hook种类三、系统调用表hook3.1 查看删除文件用到系统调用3.2 获取系统调用函数3.3 编写hook函数3.4 替换hook函数3.5 测试 参考资料 前言 hook技术在Linux系统安全领域有着广泛的应用&#xff0c;例如通过hook技术可以劫持删除文件…

Regex正则表达式 --java学习笔记

正则表达式 由一些特定字符组成&#xff0c;代表的是一个规则作用一&#xff1a;校验数据格式是否合法作用二&#xff1a;在一段文本中查找满足要求的内容 String提供了一个匹配正则表达式的方法 public boolean matches&#xff08;String regex&#xff08;正则表达式&…

高校|政务|医院|集团等网站站群建设要怎么做

网站站群集约化系统&#xff0c;建立统一部署、统一标准、统一规范、统一管理、统一安全体系、支持移动终端访问的“门户网站群”&#xff0c;建设以高校/集团/医院/门户网站为主站&#xff0c;以部门、院系、子公司及其应用为基础支撑的若干子站&#xff0c;形成若干主站子站以…