Spring中参数校验@Validation注解的详细介绍

在Spring框架中,@Valid 注解是一个强大的工具,用于验证和校验用户输入的数据,确保数据的合法性和完整性。通过结合其他注解和验证器,@Valid 注解可以轻松地实现数据验证,从而提高应用程序的健壮性和安全性。本文将详细介绍 Spring 中的 @Valid 注解,以及如何在应用程序中正确使用它。

什么是 @Valid 注解?

@Valid 注解是 Spring 框架中的一个注解,用于在方法参数或方法返回值上标记数据校验的目标。它告诉 Spring 在处理方法调用时要进行数据验证。该注解通常与其他验证相关的注解结合使用,如 @NotNull@NotBlank@Min@Max 等,用于指定验证规则。

使用 @Valid 注解进行方法参数验证

在方法参数上使用 @Valid 注解,可以在方法调用之前对参数进行验证。这对于确保输入数据的有效性非常有用。

以下是一个示例,展示了如何在 Spring 控制器方法中使用 @Valid 注解进行参数验证:

import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;@RestController
public class UserController {@PostMapping("/register")public ResponseEntity<String> registerUser(@Valid @RequestBody UserDto userDto) {// 处理用户注册逻辑return ResponseEntity.ok("User registered successfully");}
}

在上面的示例中,@Valid 注解用于 userDto 参数上。Spring 将会在调用 registerUser 方法之前,对 userDto 参数的属性进行验证。

结合其他验证注解

通常情况下,@Valid 注解会与其他验证相关的注解结合使用,以定义验证规则。例如,你可以使用 @NotNull@NotBlank@Min@Max 等注解来对属性进行更具体的验证。

public class UserDto {@NotNull@NotBlankprivate String username;@NotNull@Min(18)private Integer age;// ...其他属性和方法
}

在上面的示例中,username 属性使用了 @NotNull@NotBlank 注解,表示它不能为空且不能只包含空格。age 属性使用了 @NotNull@Min(18) 注解,表示它不能为空且必须大于等于 18。
在Spring框架中,你可以使用各种验证注解来定义不同类型的校验规则。这些注解位于javax.validation.constraints包下,用于对数据进行不同方面的验证。以下是一些常用的验证注解及其对应的校验规则:

  1. @NotNull 验证字段不能为null

  2. @NotBlank 验证字符串不能为空,且至少包含一个非空字符。

  3. @NotEmpty 验证字符串、集合或数组不能为空,不同于@NotBlank,它不要求至少包含一个非空字符。

  4. @Min(value) 验证数字必须大于等于指定的最小值。

  5. @Max(value) 验证数字必须小于等于指定的最大值。

  6. @Size(max, min) 验证字符串、集合或数组的大小必须在指定的范围内。

  7. @Email 验证字符串是否为合法的电子邮件地址。

  8. @Pattern(regexp) 验证字符串是否符合指定的正则表达式。

  9. @Digits(integer, fraction) 验证数字是否符合指定的位数要求,包括整数和小数部分。

  10. @Positive 验证数字必须为正数。

  11. @Negative 验证数字必须为负数。

  12. @Past 验证日期必须为过去的时间。

  13. @Future 验证日期必须为将来的时间。

  14. @AssertTrue 验证字段必须为true

  15. @AssertFalse 验证字段必须为false

  16. @CreditCardNumber 验证字符串是否为合法的信用卡号。

  17. @URL 验证字符串是否为合法的URL。

  18. @Valid 用于标记需要嵌套验证的对象。

这些只是一些常见的验证注解,实际上在Spring中还有更多的验证注解可供使用。你可以根据具体的业务需求,选择合适的验证注解来定义数据的校验规则。另外,你还可以通过自定义验证器来实现更复杂的校验逻辑,以满足特定的验证需求。

自定义验证器

除了使用预定义的验证注解,你还可以创建自定义的验证器来满足特定的验证需求。要创建一个自定义的验证器,需要实现 javax.validation.ConstraintValidator 接口。

以下是一个示例,展示了如何创建一个自定义的验证器:

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;public class AgeConstraintValidator implements ConstraintValidator<AgeConstraint, Integer> {@Overridepublic boolean isValid(Integer age, ConstraintValidatorContext context) {return age != null && age >= 18;}
}

然后,你可以在自定义的注解上使用这个验证器:

import javax.validation.Constraint;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.RUNTIME;@Target({FIELD, METHOD, PARAMETER})
@Retention(RUNTIME)
@Constraint(validatedBy = AgeConstraintValidator.class)
public @interface AgeConstraint {String message() default "Invalid age";Class<?>[] groups() default {};Class<? extends Payload>[] payload() default {};
}

最后,将这个自定义的注解应用到需要验证的属性上:

public class UserDto {@NotNull@NotBlankprivate String username;@AgeConstraintprivate Integer age;// ...其他属性和方法
}

总结

@Valid 注解是 Spring 框架中一个重要的工具,用于实现数据的验证和校验。结合其他验证注解和自定义验证器,它能

够轻松地验证用户输入的数据,从而提高应用程序的稳定性和安全性。通过在方法参数或方法返回值上添加 @Valid 注解,你可以确保数据的有效性,并在数据不合法时产生相应的错误信息,从而提供更好的用户体验和数据完整性。

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

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

相关文章

【ChatGPT 指令大全】怎么使用ChatGPT辅助程式开发

目录 写程式 解读程式码 重构程式码 解 bug 写测试 写 Regex 总结 在当今快节奏的数字化世界中&#xff0c;程式开发变得越来越重要和普遍。无论是开发应用程序、网站还是其他软件&#xff0c;程式开发的需求都在不断增长。然而&#xff0c;有时候我们可能会遇到各种问题…

直播课 | 大橡科技研发总监丁端尘博士“类器官芯片技术在新药研发中的应用”

从类器官到类器官芯片&#xff0c;正在生物科学领域大放异彩。 药物研发需要新方法 众所周知&#xff0c;一款新药是一个风险大、周期长、成本高的艰难历程&#xff0c;国际上有一个传统的“双十”说法——10年时间&#xff0c;10亿美金&#xff0c;才可能成功研发出一款新药…

SpringCloud实用篇4——MQ RabbitMQ SpringAMQP

目录 1 初识MQ1.1 同步和异步通讯1.1.1 同步通讯1.1.2 异步通讯 1.2 技术对比 2.快速入门2.1 安装RabbitMQ2.1.1 单机部署2.1.2集群部署 2.2 RabbitMQ消息模型2.3.导入Demo工程2.4 入门案例2.4.1 publisher实现2.4.2 consumer实现 3 SpringAMQP3.1 Basic Queue 简单队列模型3.1…

玩一玩通义千问Qwen开源版,Win11 RTX3060本地安装记录!

大概在两天前&#xff0c;阿里做了一件大事儿。 就是开源了一个低配版的通义千问模型--通义千问-7B-Chat。 这应该是国内第一个大厂开源的大语言模型吧。 虽然是低配版&#xff0c;但是在各类测试里面都非常能打。 官方介绍&#xff1a; Qwen-7B是基于Transformer的大语言模…

Java EE 突击 9 - Spring Boot 日志文件

Spring Boot 日志文件 学习目标一 . 日志有什么用1.1 日志格式说明 二 . 自定义日志打印2.1 得到日志对象2.2 使用日志对象提供的方法 , 输出自定义的日志内容2.3 日志的级别 三 . 日志持久化3.1 在配置文件里面设置日志名称3.2 设置日志的保存目录 四 . 日志级别的设置五 . 简…

js有哪些内置对象

全局的对象或称为标准内置对象&#xff0c;不要和“全局对象”混淆&#xff0c;这里说的全局的对象是说在全局作用域里的对象。全局作用域中的其他对象可以由用户创建的脚本创建或由宿主程序提供。 Object Object:js中所有对象都是由Object构造函数创建的。它提供了对象的基本功…

flutter 手写日历组件

先看效果 直接上代码 calendar_popup_view.dart import package:flutter/material.dart; import package:intl/intl.dart;import custom_calendar.dart; import hotel_app_theme.dart;class CalendarPopupView extends StatefulWidget {const CalendarPopupView({required th…

【【萌新的STM32 学习-6】】

萌新的STM32 学习-6 BSP 文件夹&#xff0c;用于存放正点原子提供的板级支持包驱动代码&#xff0c;如&#xff1a;LED、蜂鸣器、按键等。 本章我们暂时用不到该文件夹&#xff0c;不过可以先建好备用。 CMSIS 文件夹&#xff0c;用于存放 CMSIS 底层代码&#xff08;ARM 和 ST…

Spring 是什么框架?

Spring 是 Java EE 编程领域的一款轻量级的开源框架&#xff0c;由被称为“Spring 之父”的 Rod Johnson 于 2002 年提出并创立&#xff0c;它的目标就是要简化 Java 企业级应用程序的开发难度和周期。 Spring 自诞生以来备受青睐&#xff0c;一直被广大开发人员作为 Java 企业…

AUTOSAR规范与ECU软件开发(基础篇)1.1汽车电子控制系统介绍

目录 前言 1 电子技术在汽车上的应用 1.1 汽车电子技术的发展历史

winrar压缩命令实例

"C:\Program Files\WinRAR\WinRAR.exe" a -ibck -ag -r -m3 -x*\bin\ -x*\obj\ -x*\publish\ -x"abc.csproj.user" abc.rar * a 添加文件到压缩文件夹 -ibck 在后台运行 WinRAR -ag 表示当创建压缩…

深度学习之用PyTorch实现逻辑回归

0.1 学习视频源于&#xff1a;b站&#xff1a;刘二大人《PyTorch深度学习实践》 0.2 本章内容为自主学习总结内容&#xff0c;若有错误欢迎指正&#xff01; 代码&#xff08;类比线性回归&#xff09;&#xff1a; # 调用库 import torch import torch.nn.functional as F#…

2023安全与软工顶会/刊中区块链智能合约相关论文

2023安全与软工顶会/刊中区块链智能合约相关论文 前言软工顶会ISSTAFSEASEICSE 软工顶刊TOSEMTSE 安全顶会S&PUSENIX SecurityCCSNDSS 前言 主要整理了2023年四大安全顶会、四大软工顶会和两个软工顶刊中&#xff0c;有关区块链智能合约的相关论文。 搜索方式是&#xff1…

HDFS小文件解决方案---archive归档文件命令

小文件解决方案 背景Archive概述创建archive查看归档文件查看归档之后的样子查看归档文件之前的样子 提取archivearchive注意事项 背景 hdfs并不擅长存储小文件&#xff0c;因为每个文件最少一个block&#xff0c;每个block的元数据都会在namenode占用内存&#xff0c;如果存在…

Linux驱动之设备树添加蜂鸣器驱动

目录 一、蜂鸣器简介 二、硬件原理分析 三、蜂鸣器驱动原理 四、开发环境 五、修改设备树文件 1、添加 pinctrl 节点 2、添加 BEEP 设备节点 3、检查 PIN 是否被其他外设使用 六、蜂鸣器驱动程序编写 七、测试程序编写 八、运行验证 在 I.MX6U-ALPHA 开发板上有一个有源…

一种水文水利行业满管非满管双声道流量计安装调试

供电电源 用户应该特别注意&#xff1a;若是交流&#xff08;AC220V&#xff09;供电的主机插入直流电源&#xff0c;或者直流&#xff08;DC24V&#xff09;供电的主机接入AC220V电源&#xff0c;就会把流量计烧毁。 普通主机&#xff08;包括固定式主机、盘装式主机&#x…

前沿分享-无创检测血糖RF波

非侵入性血糖仪&#xff0c;利用射频 (RF) 波连续测量血液中的葡萄糖水平。利用射频波技术连续实时监测血液中的葡萄糖水平&#xff0c;使用的辐射要比手机少得多。 大概原理是血液中的葡萄糖是具有介电特性&#xff0c;一般来说就是介电常数。 电磁波波幅的衰减反映了介质对电…

pandoc word转markdown之后正则修改

问题 用pandoc工具将doc文件转换为markdown文件后&#xff0c;有关图片的处理会变成&#xff1a; (./url路径){width“3.46875in” height“1.0729166666666667in”} 但是我要展示到前端的&#xff0c;前端组件用的v-md-preview&#xff0c;结果展示的时候&#xff0c;后面的宽…

ES6学习-module语法

Module语法 CommonJS模块 let { readfile } require(fs) # 等同于 let _fs require(fs) let readfile _fs.readfile //这种加载称为“运行时加载”ES6模块 import { stat, exists, readFile } from fs;这种加载称为“编译时加载”或者静态加载 静态加载带来的各种好处 …

火车头采集器AI伪原创【php源码】

大家好&#xff0c;本文将围绕python作业提交什么文件展开说明&#xff0c;python123怎么提交作业是一个很多人都想弄明白的事情&#xff0c;想搞清楚python期末作业程序需要先了解以下几个事情。 火车头采集ai伪原创插件截图&#xff1a; I have a python project, whose fold…