spring-boot---validation,参数校验,分组,嵌套,各种类型

news2024/11/25 20:30:58
写在前面:
参数校验基本上是controller必做的事情,毕竟前端传过来的一切都不可信。 但是每次if(StrUtil.isNotNull())啥的有时候多还难写。validation可以简化这一操作。

文章目录

  • 项目构建
  • 问题展示
  • validation使用
    • 快速入门
    • 注释
  • Valid与Validated区别
    • 使用范围
    • 分组
    • 嵌套验证

项目构建

采用boot3,主要依赖为spring web 和validation
在这里插入图片描述

主要依赖:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
        </dependency>

项目结构
在这里插入图片描述

问题展示

先来个简单的案例

@RestController
public class ValidationController {

    @GetMapping("/get")
    public String get(String name,String age){
        System.out.println(name);
        System.out.println(age);
        return "ok";
    }
}

点击这个就可以发送请求了
在这里插入图片描述
发送出去不会做任何校验
在这里插入图片描述
这个的处理我们可以选择加上@RequestParam注解。
@RequestParam默认属性require为true,就是必须要传值,

 public String get(@RequestParam String name,@RequestParam String age)

报错返回
在这里插入图片描述
封装成实体类也是一样的。

但是这样只能做非null判断,不能做复杂的判断。
在body里面的时候更加不会校验了
在这里插入图片描述

validation使用

那么validation又如何做到呢。

快速入门

需求:get请求中,name长度在2-10,age在10-100岁之间且都不为null。

    @GetMapping("/get")
    public String get(@Length(max = 10,min = 2) String name,
                      @Min(10)@Max(100) String age){
        System.out.println("name = " + name);
        System.out.println("age = " + age);
        return "ok";
    }

为null发送,好ok一点用没有。
在这里插入图片描述
我查资料发现需要参数前面加上启动校验@Validated或者@Valid注解,但是无论我怎么放到都是没有校验。
全部无效。
在这里插入图片描述
我之前研究了半天,然后才发现,如果想要这样校验的话,需要在controller类上面加上@Validated且Valid都不行。
在这里插入图片描述
如果是实体类接收就不一样了。
直接在方法就可以了
在这里插入图片描述

注释

到这里基本使用应该就差不多知道了。
现在来进行注解的学习。

注解通用属性
基本上都有的

属性描述
message错误返回描述
groups分组,可以进行更加灵活的选择。
payload

无参注解,无必须传的值

注解限制类型
@Null限制只能为null接收任何类型,这个应该用的比较少
@NotNull限制必须不为null接收任何类型
@AssertFalse限制必须为false支持的类型包括 boolean 和 Boolean。null 元素被视为有效。
@AssertTrue限制必须为true支持的类型包括 boolean 和 Boolean。null 元素被视为有效。
@Future限制必须是一个将来的日期大部分的时间类如果Date、Calendar、Instant、LocalDate等。null 元素被视为有效
@Past限制必须是过去的时刻、日期或时间和上面一样
@PastOrPresent带注释的元素必须是过去或现在的时刻、日期或时间同上
@NotEmpty带批注的元素不得为 null和空CharSequence(计算字符序列的长度)Collection (集合大小)Map (大小)数组(计算数组长度)
@NotBlank带批注的元素不得且 null 必须至少包含一个非空格字符CharSequence
@Positive带注释的元素必须是严格的正数(即 0 被视为无效值)。BigDecimal、BigInteger、byteintlong、 short及其floatdouble各自的包装器
@PositiveOrZero正数或0同上

大小注解,用于限值大小

注解限制类型
@DecimalMax(value,inclusive)限制必须为一个不大于指定值的value数字,inclusive:指定指定的最小值是包含的还是排除的true为不包括最小值BigDecimal、BigInteger、CharSequence、byte、 shortintlong及其各自的包装器,请注意, double 由于舍入错误,不支持 (某些 float 提供程序可能会提供一些近似支持)。null 元素被视为有效。
@DecimalMin(value,inclusive)限制必须为一个不小于指定值的value数字,inclusive:最大值是否包括同上
@Digits(integer,fraction)必须是接受范围内的数字,且整数部分的位数不能超过integer,小数部分的位数不能超过fraction同上
@Max(value)限制必须为一个不大于指定值的数字同上
@Min(value)限制必须为一个不小于指定值的数字同上
@Length(min = 6, max = 16)指定传入的字符串的长度字符串
@Size(max,min)限制字符长度必须在min到max之间 【不是数字】同notempty,集合类数组和字符
@Range带批注的元素必须在适当的范围内。应用于数值或数值的字符串表示形式。

基于正则类型

注解限制类型
@Pattern(value)限制必须符合指定的正则表达式CharSequence,null有效
@Email验证注解的元素值是Email,可选值regexp,flags也可以通过正则表达式和flag指定自定义的email格式。因为每个人要求的邮箱可能格式也不一样,如我可以通过regexp设置后缀必须为@qq.comCharSequence,null有效
@CreditCardNumber信用卡校验同上
@URL批注的字符串是否为 URL基于正则表达式的 。同上
@UUID批注的字符序列是否为有效的 UUID,version指定版本variant变体,letterCase所需的字母大小写 默认情况下只有小写有效,allowNil如果 nil UUID 有效 根据默认值 nil UUID 00000000-0000-0000-0000-000000000000 有效,allowEmpty允许空字符串。默认情况下不允许空字符串

脚本注解
@ScriptAssert
它根据批注元素计算脚本表达式。此约束可用于实现验证例程,脚本表达式可以用任何脚本或表达式语言编写,在类路径上可以找到 JSR 223 (“JavaTM 平台脚本”)兼容引擎。下面的清单显示了使用 JDK 附带的 JavaScript 引擎的示例:
我看到的时候给我震惊了一下,他注解写的啥??任何表达式语言??不过可能是我没见过世面,或者是知识点用的少,java6就支持JavaScript。不过一般很少用吧。

下面是一个校验时间的脚本

@ScriptAssert(lang = "javascript", script = "_this.startDate.before(_this.endDate)")   
public class CalendarEvent {
     private Date startDate;
     private Date endDate;
     //...
}

注意!!!java11开始就移除了NashornScriptEngineFactory,所以11以上需要添加依赖才可以使用javascript
需要新增

        <dependency>
            <groupId>org.openjdk.nashorn</groupId>
            <artifactId>nashorn-core</artifactId>
            <version>15.4</version>
        </dependency>

没有通过

在这里插入图片描述
修改时间通过了
在这里插入图片描述

Valid与Validated区别

Validated是Valid的加强版

使用范围

经过我的层层验证

  1. controller类上:
    在controller类上只有使用validated,将开启所有的路径参数验证,对实体类(路径和body)无效
  2. 方法上:
    全部无效,无论是路径还说body,2个注解都没用。
  3. 入参上:
    只有在对body或者路径参数实体类或者添加注解才有效,2个都有效,对单独的类型无效
  4. 实体类的属性上
    Valid有效,且路径参数有效,body无效,body需要自己参数开启,无论参数是否加验证注解

两者是否能用于成员属性(字段)上直接影响能否提供嵌套验证的功能。

分组

@Validated:提供了一个分组功能,可以在入参验证时,根据不同的分组采用不同的验证机制。没有添加分组属性时,默认验证没有分组的验证属性。Valid是不能进行分组的,灵活性更差。

public class DemoQuery {
    @Length(max = 10, min = 2,groups = {Demo1.class, Demo2.class},message = "name长度不符合要求")
    private String name;
    @Min(value = 10,groups = {Demo1.class}) @Max(100)
    @NotNull
    private Integer age;
}

    @PostMapping("/post2")
    public String post2(@Validated({Demo2.class}) @RequestBody DemoQuery query, @NotNull String id) {
        System.out.println("name = " + query.getName());
        System.out.println("age = " + query.getAge());
        System.out.println("id = " + id);
        return "ok";
    }

不通过
在这里插入图片描述

通过
在这里插入图片描述
改为demo1
在这里插入图片描述

嵌套验证

新增一个类

@Data
public class NestedQuery {

    @NotNull
    private String id;

    @Valid
    @NotNull
    private DemoQuery querys;
}

    @GetMapping("/nested")
    public String nested(@Validated NestedQuery query, BindingResult bindingResult) {
        System.out.println("id = " + query.getId());
        System.out.println("query = " + query.getQuerys());
        System.out.println(bindingResult);
        return "ok";
    }

发送返回的居然是ok,
在这里插入图片描述
但是在控制台,验证说出错了,说明嵌套的错误不会直接返回,而是会记录。需要自己处理一下。

在这里插入图片描述

Assert.isTrue(!bindingResult.hasErrors(),"参数错误");

在这里插入图片描述
结束:收工,累死了。

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

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

相关文章

【面试必刷TOP101】判断一个链表是否为回文结构 链表的奇偶重排

目录 题目&#xff1a;判断一个链表是否为回文结构_牛客题霸_牛客网 (nowcoder.com) 题目的接口&#xff1a; 解题思路&#xff1a; 代码&#xff1a; 过啦&#xff01;&#xff01;&#xff01; 题目&#xff1a;链表的奇偶重排_牛客题霸_牛客网 (nowcoder.com) 题目的…

Twitter图片数据优化的细节

Twitter个人数据优化&#xff1a;吸引更多关注和互动 头像照片在Twitter上&#xff0c;头像照片是最快识别一个账号的方法之一。因此&#xff0c;请务必使用公司的标志或与品牌相关的图片。建议尺寸为400x400像素。 为了建立强大的品牌形象和一致性&#xff0c;强烈建议在所有…

WebGL 初始化着色器

目录 前言 初始化着色器的7个步骤 创建着色器对象&#xff08;gl.createShader&#xff08;&#xff09;&#xff09; gl.createShader&#xff08;&#xff09;规范 gl.deleteShader&#xff08;&#xff09;规范 指定着色器对象的代码&#xff08;gl.shaderSource&…

大二层—多链接透明互联协议如何工作

大二层就引入了 TRILL&#xff08;Transparent Interconnection of Lots of Link&#xff09;&#xff0c;即多链接透明互联协议。它的基本思想是&#xff0c;二层环有问题&#xff0c;三层环没有问题&#xff0c;那就把三层的路由能力模拟在二层实现。 运行 TRILL 协议的交换…

23062QTday5

完成登录界面的注册功能 头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QApplication> #include <iostream> #include <QMessageBox> #include <QtDebug> #include <QIcon> #include<QPushButton> #incl…

Leetcode—— 20.有效的括号

20. 有效的括号 给定一个只包括 ‘(’&#xff0c;‘)’&#xff0c;‘{’&#xff0c;‘}’&#xff0c;‘[’&#xff0c;‘]’ 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭…

【LeetCode-中等题】 222. 完全二叉树的节点个数

文章目录 题目方法一&#xff1a;把该题当做一个普通的二叉树来做&#xff08;任何遍历都可以&#xff09;方法二&#xff1a;利用完全二叉树的性质来做 题目 方法一&#xff1a;把该题当做一个普通的二叉树来做&#xff08;任何遍历都可以&#xff09; 例如&#xff1a;二叉树…

如何选择一只股票,待完善。

目录 ROE(盈利能力)增长率(成长能力)收现比(营收质量)总资产周转率(经营能力)增长率(成长能力)商誉净资产比(排雷)流动比率(排雷) ROE(盈利能力) 什么是ROE? ROE 全名叫 Return of Equity&#xff0c;翻成中文叫“股东回报率”&#xff0c;也叫"净资产收益率"。 …

token登录的实现

token登录的实现 我这种token只是简单的实现token&#xff0c;就是后端利用UUID 生成简单随机码&#xff0c;利用随机码作为在Redis中的键&#xff0c;然后存储的用户信息作为值&#xff0c;在每次合理请求的时候对token的有效时间进行刷新&#xff08;利用拦截器&#xff09;&…

常见的文件格式

一、C:\fakepath\新建文本文档.txt [object String] 实现方式&#xff1a; <input onchange"test(this.value)" type"file"></input><script>function test(e){console.log(e,Object.prototype.toString.call(e))}</script> 二、…

js 数组对象转为 key对应的数组

1、将要转换的格式 2、 转换后格式 3、代码处理 可以使用forEach循环遍历原始数组&#xff0c;并将每个对象的属性值分别存储在一个新的对象中。然后&#xff0c;使用Object.values()方法获取这些属性值的数组。 console.log(result--, result);let dealRes {};result.forEac…

10.12广州见 | 第十六届智慧城市大会报名通道全面开启

第十六届中国智慧城市大会 将于10月12日至13日 在广州举办 智慧城市是数字中国、智慧社会的核心载体&#xff0c;是数字时代城市发展的高级形态。由中国服务贸易协会、中国测绘学会、中国遥感委员会主办的第十六届中国智慧城市大会&#xff0c;将以“数实融合开放创新智引未…

“降本”是关键,FCU1104打造低成本工商业储能EMS

在不久前举行的EESA中国国际储能展上&#xff0c;“工商业储能”成为了热度最高的话题之一&#xff0c;几乎每家展出工商业储能系统的展商都收获了大量观众的驻足围观&#xff0c;热度非凡。究竟是怎样的原因让工商业储能如此瞩目呢&#xff1f; 通过与多家储能厂家沟通并查阅…

群晖管家+内网穿透实现公网远程访问本地黑群晖

白嫖怪狂喜&#xff01;黑群晖也能使用群晖管家啦&#xff01; 文章目录 白嫖怪狂喜&#xff01;黑群晖也能使用群晖管家啦&#xff01;1.使用环境要求&#xff1a;2.下载安装群晖管家app3.随机地址登陆群晖管家app4.固定地址登陆群晖管家app 自己组装nas的白嫖怪们虽然也可以通…

IP转地理位置:探讨技术与应用

IP地址是互联网上设备的唯一标识符&#xff0c;而将IP地址转换为地理位置信息是网络管理、安全监控和市场定位等领域中的一项重要任务。本文将深入探讨IP转地理位置的技术原理和各种应用场景。 IP地址与地理位置 IP地址&#xff08;Internet Protocol Address&#xff09;是一…

一、八大排序(sort)

文章目录 一、时间复杂度&#xff08;一&#xff09;定义&#xff1a;常数操作 二、空间复杂度&#xff08;一&#xff09;定义&#xff1a; 三、排序&#xff08;一&#xff09;选择排序1.定义2.代码3.特性 &#xff08;二&#xff09;冒泡排序1.定义2.代码3.特性 &#xff08…

樱花(筛素数+约数)

题目 给定一个整数 n&#xff0c;求有多少正整数数对 (x,y) 满足 1/x1/y1/n!。 输入格式 一个整数 n。 输出格式 一个整数&#xff0c;表示满足条件的数对数量。 答案对 1e97取模。 数据范围 1≤n≤106 输入样例&#xff1a; 2输出样例&#xff1a; 3样例解释 共有…

中华崛起,科技强国!这三款充满科技风的科技模板,一起来探索吧

最近是不是都被华为mate60和苹果15刷屏了啊 &#xff0c;在我们的生活中&#xff0c;科技有着千变万化的面貌。它让我们的世界变得越来越小&#xff0c;让我们的生活越来越便捷。它使我们的梦想成为现实&#xff0c;使我们的思想得以落地。它打开了新的视野&#xff0c;为我们提…

java面向对象(八)

文章目录 一、abstract关键字的使用1.概念2. abstract修饰类:抽象类3.abstract修饰方法&#xff0c;抽象方法4.abstract使用上的注意点&#xff1a;5.抽象类的匿名子类 二、计算一段代码执行所花费的时间三、接口的使用1.接口的使用2.定义接口中的成员3.代码demo4.Java类可以实…

LabVIEW应用开发——前面板和程序框图

上篇我们讲述了LabVIEW的安装并且新建了一个VI程序成功运行&#xff0c;这篇我们详细了解界面上一些工具、属性和层次结构。 LabVIEW安装 我们双击打开上次创建的.vi文件。 这时候我们发现只有前面板&#xff0c;程序框图界面不见了&#xff0c;我们需要使用CtrlE或者在Windows…