【优雅的参数验证@Validated】@Validated参数校验的使用及注解详解——你还在用if做条件验证?

article/2025/10/1 8:59:16

@Validated参数校验的使用及注解详解

  • 你还在用if做条件验证吗?
  • 一、优雅的参数验证@Validated
    • 1.@Valid和@Validated的用法(区别)
    • 2.引入并使用@Validated参数验证
  • 二、javax.validation.constraints下参数条件注解详解
  • 三、自定义条件注解

你还在用if做条件验证吗?

请先看看下面代码:(简单举个例子,代码并不规范)

    @ApiOperation("新增用户")@PostMapping("/addUser")public ResultVo insert(@ApiParam("用户信息实体") @RequestBody User user){if(user.getUserName!=null){throw new BusinessException("用户名称不能为空");}if(user.getUserPhone!=null){throw new BusinessException("用户电话不能为空");}if( user.getUserPhone().length()){throw new BusinessException("用户电话格式不规范");}return new ResultVo(userService.insert(user));}

以上代码主要是为了对用户user实体进行条件验证。
但是那么多的if, 写得纯纯得小白一个,也使得代码显得臃肿不美观不优雅!
接下来,让我们学习使用优雅的参数验证@Validated!

一、优雅的参数验证@Validated

@Valid和@Validated是Spring Validation框架提供的参数验证功能。

1.@Valid和@Validated的用法(区别)

二者主要作用在于 都作为标准JSR-303规范,在检验Controller的入参是否符合规范时,使用@Validated或者@Valid在基本验证功能上没有太多区别。但是在分组、注解地方、嵌套验证等功能上两个有所不同:

@Valid:
@Valid注解用于校验,所属包为:javax.validation.Valid。

用在方法入参上无法单独提供嵌套验证功能。**能够用在成员属性(字段)**上,提示验证框架进行嵌套验证。能配合嵌套验证注解@Valid进行嵌套验证。

@Validated:
@Validated是@Valid 的一次封装,是Spring提供的校验机制使用。

用在方法入参上无法单独提供嵌套验证功能。不能用在成员属性(字段)上,也无法提示框架进行嵌套验证。能配合嵌套验证注解@Valid进行嵌套验证。

2.引入并使用@Validated参数验证

  1. 引入校验的依赖包
        <!--第一种方式导入校验依赖:使用springboot时,在org\springframework\spring-context\5.2.1.RELEASE\spring-context-5.2.1.RELEASE.jar--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><!--第二种方式导入校验依赖--><dependency><groupId>javax.validation</groupId><artifactId>validation-api</artifactId><version>2.0.1.Final</version></dependency><!--第三种方式导入校验依赖--><dependency><groupId>org.hibernate.validator</groupId><artifactId>hibernate-validator</artifactId></dependency>
  1. 找到自己的实体类定义自己要校验的参数
    在这里插入图片描述

3.在controller的入参处添加@Validated注解(@Validated可以指定groups区别验证,@Valid不可以指定groups,见上面二者区别)

@Validated(addGroup.class)就是给参数进行了分组校验

    @ApiOperation("新增用户")@PostMapping("/addUser")public ResultVo insert(@ApiParam("用户信息实体") @Validated(addUser.class) @RequestBody User user){return new ResultVo(userService.insert(user));}

那么addGroup.class是哪里来的??什么作用?
addGroup.class:是一个接口类,简单的来说:就是用来给参数做标记的(里面不需要写任何代码)
在这里插入图片描述

到这里基本的使用就结束了!

二、javax.validation.constraints下参数条件注解详解

实现参数验证功能,我们需要@Validated注解配合 在实体类的的参数加上条件验证注解(设置具体的条件限制规则)一起实现参数验证功能。

而这些参数条件注解是由javax.validation.constraints包下提供,主要如下:

  1. @NotNull :被注解的元素必须不为null

  2. @NotBlank注解 :验证注解的元素值不为空(不为null、去除首位空格后长度为0) ,并且类型为String。

  3. @NotEmpty注解 :验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0) ,并且类型为String。

  4. @AssertTrue注解 :被注解的元素必须为true,并且类型为boolean。

  5. @AssertFalse注解 :被注解的元素必须为false,并且类型为boolean。

  6. @Min注解 :被注解的元素其值必须大于等于最小值,并且类型为int,long,float,double。

  7. @Max注解:被注解的元素其值必须小于等于最小值,并且类型为int,long,float,double。

  8. @DecimalMin注解 :验证注解的元素值大于等于@DecimalMin指定的value值,并且类型为BigDecimal。

  9. @DecimalMax注解 :验证注解的元素值小于等于@DecimalMax指定的value值 ,并且类型为BigDecimal。

  10. @Range注解 :验证注解的元素值在最小值和最大值之间,并且类型为BigDecimal,BigInteger,CharSequence,byte,short,int,long。

  11. @Past注解 :被注解的元素必须为过去的一个时间,并且类型为java.util.Date。

  12. @Future注解 :被注解的元素必须为未来的一个时间,并且类型为java.util.Date。

  13. @Size注解 :被注解的元素的长度必须在指定范围内,并且类型为String,Array,List,Map。

  14. @Length注解 :验证注解的元素值长度在min和max区间内 ,并且类型为String。

  15. @Digits注解 :验证注解的元素值的整数位数和小数位数上限 ,并且类型为float,double,BigDecimal。

  16. @Pattern注解 :被注解的元素必须符合指定的正则表达式,并且类型为String。

  17. @Email注解: 验证注解的元素值是Email,也可以通过regexp和flag指定自定义的email格式,类型为String。

三、自定义条件注解

如果在写项目的过程中,参数需要的条件注解满足不上,则我们需要自定义注解来完成

步骤:

1.创建一个自定义的注解类

/**自定义条件注解* @author: wxh* @version:v1.0* @date: 2022/11/14 22:39*/
@Target({ElementType.FIELD,ElementType.METHOD,ElementType.ANNOTATION_TYPE,ElementType.CONSTRUCTOR,ElementType.PARAMETER,ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = {ListValueConstraintValidator.class})
public @interface ListValue {//配置路径,后端传递信息String message() default "{com.itfuture.e.valid.ListValue.message}";Class<?>[] groups() default {};Class<? extends Payload>[] payload() default {};//自定义一个类型来存放数据(数组)int[] values() default {};}

2.创建一个逻辑处理数据的方法

/**自定义显示状态* @author: wxh* @version:v1.0* @date: 2022/11/14 22:49*/
public class ListValueConstraintValidator implements ConstraintValidator<ListValue,Integer> {//set存储private Set<Integer> set = new HashSet<>();//初始化数据//listValue拿到的是注解中的数据@Overridepublic void initialize(ListValue constraintAnnotation) {//拿到注解中自定义的数据,且是数组型的int[] values = constraintAnnotation.values();//放在数组里,遍历判断for(int value:values){set.add(value);}}//判断数据是否相同@Overridepublic boolean isValid(Integer integer, ConstraintValidatorContext constraintValidatorContext) {if(set.contains(integer)){return true;}return false;}
}

3.String message() default “{com.atguigu.common.valid.ListValue.message}”;

这个消息:message() default "{com.atguigu.common.valid.ListValue.message}"也可以通过配置文件去配置:
在这里插入图片描述

4.在实体类的参数条件中来调用:

在这里插入图片描述

至此,参数验证基本完述!


http://chatgpt.dhexx.cn/article/1fkESy6I.shtml

相关文章

@Validated和@Valid的区别

Validated和Valid的区别主要体现在3个方面&#xff1a; 1. 分组 Validated&#xff1a;提供了一个分组功能&#xff0c;可以在入参验证时&#xff0c;根据不同的分组采用不同的验证机制。没有添加分组属性时&#xff0c;默认验证没有分组的验证属性。 实体类&#xff1a; Co…

@Validated注解

一. 在javaEE项目中经常要判断一些字段的格式是否正确。在以前基本上都是用if(啥啥 啥)else(啥啥啥) 。但是在知道Validated之后就开始尝试用这个注解了。不但减轻代码量而 且代码更加的易读规整。 二. 下面就以简单例子来说明。 Controller 层 PostMapping("student&q…

@Valid 和 @Validated 注解用法详解

目录 案例引入 Valid 详解 Validated 详解 Valid 和 Validated 比较 案例引入 下面我们以新增一个员工为功能切入点&#xff0c;以常规写法为背景&#xff0c;慢慢烘托出 Valid 和 Validated 注解用法详解。 那么&#xff0c;首先&#xff0c;我们会有一个员工对象 Emplo…

@Validated注解详解,分组校验,嵌套校验,@Valid和@Validated 区别,Spring Boot @Validated

技术栈&#xff1a; spring boot 2.3.3.RELEASE hibernate-validator 文末附项目源代码 目录 简述 项目依赖 全局异常处理类 基础参数校验 实体类 控制类 测试 嵌套参数验证 实体类 控制类 测试 分组参数验证 接口类 实体类 控制类 测试 Valid和Validated 区…

@Valid与@Validated的区别

1.介绍 说明&#xff1a; 其实Valid 与 Validated都是做数据校验的&#xff0c;只不过注解位置与用法有点不同。 不同点&#xff1a; &#xff08;1&#xff09; Valid是使用Hibernate validation的时候使用。Validated是只用Spring Validator校验机制使用。 &#xff08;2&…

优雅的使用Validated

前言 Validation是一套帮助我们继续对传输的参数进行数据校验的注解&#xff0c;通过配置Validation可以很轻松的完成对数据的约束。 这个技术一直都想进行梳理了很多复杂校验不会使用&#xff0c;本章节用来进行梳理 validated 用于参数的校验&#xff0c;支持简单和复杂(分组…

@Valid与@Validated区别

1.Valid与Validated作用 Valid与Validated都是用来校验接收参数的。Valid是使用Hibernate validation的时候使用Validated是只用Spring Validator校验机制使用说明&#xff1a;java的JSR303声明了Valid这类接口&#xff0c;而Hibernate-validator对其进行了实现。Validated与V…

java中换行符_Java 中的空格符、换行符等怎么表示

展开全部 特殊字符的自表示方法&#xff1a;&#xff1a; 1、\t 空格2113 (\u0009) 2、\n 换行 (\u000A) 3、\\ 反斜杠5261 4、\r 回车 (\u000D) 5、\d 数字4102等价1653于[0-9] 6、\D 非数字等价于[^0-9] 7、\s 空白符号 [\t\n\x0B\f\r] 8、\S 非空白符号 [^\t\n\x0B\f\r] 9、…

java通用文件换行符_java通用文件换行符

java通用文件换行符 [2021-02-07 00:14:46] 简介: java中的换行符是【\n】和【\r】。二者的区别是:【\r】表示回车,【\n】表示新行,但两者都可以实现换行。具体实现方法如:【System.out.print("\n")】。在java中,可以使用\n和\r来 php如何去掉换行符 2020-09-0…

java 处理换行符_Java 文件换行符识别与转换

项目经验,如需转载,请注明作者:Yuloran (t.cn/EGU6c76) 背景 项目开发需要手动合入几十种语言的翻译到 string.xml 中,这是一件非常痛苦的事情:Copy、Paste,Copy、Paste,Copy、Paste... 人都快疯了!被逼无奈写了个自动替换翻译的工具,原理很简单:解析 Excel中的翻译,…

java回车换行符linux,回车换行符 java

回车换行符 java [2021-01-31 11:28:50] 简介: java中的换行符是【\n】和【\r】。二者的区别是:【\r】表示回车,【\n】表示新行,但两者都可以实现换行。具体实现方法如:【System.out.print("\n")】。在java中,可以使用\n和\r来 php如何去掉换行符 2020-09-02 p…

java 分行符_java换行符有哪些

在java中可以使用的换行符有&#xff1a;"\n"表示新行、“\r”表示回车&#xff0c;\r \n”。 在java中需要在字符串(文本)末尾包含换行符"\n"&#xff0c;“\r”或者“\r \n”就可以进行换行。 换行符"\n" "\n"也称换行&#xff0c;一…

java换行符如何使用

java换行符的使用方法&#xff1a;1、换一行【System.out.print(" “)】&#xff1b;2、换两行【System.out.println(” “)】&#xff1b;3、换三行【System.out.println(” " )】。 java换行符的使用方法&#xff1a; 可以使用Java中 和 的换行&#xff0c;不过也…

java:换行符“\n”

换行符 一、关键代码二、简单说明三、源码&#xff08;一&#xff09;、源码A&#xff08;二&#xff09;、源码A的运行效果 四、结语五、定位日期 一、关键代码 java的换行符 "\n" 两次换行&#xff08;相当于摁两次回车键的效果&#xff09; System.out.println(&…

关于ping命令出现大量dup原因

(DUP!) 这个东西是DUPLICATE的一个缩写&#xff0c;也就是ping包的时候收到多个重复值回应&#xff0c;通常发生在linux环境下比较多&#xff0c;windows环境对ping的reply只接到第一个&#xff0c;后续的重复回应会被废弃。 发生这种情况通常是主宿机的IP冲突&#xff0c;或者…

c语言 字符串dup,C语言中dup和dup2函数的不同和使用

在unix高级编程中有介绍dup和dup2&#xff0c;但是没有实例说明&#xff0c; 笔者自己结合实例进行了测试了解。 在linux下&#xff0c;通过open打开以文件后&#xff0c;会返回一个文件描述符&#xff0c;文件描述符会指向一个文件表&#xff0c;文件表中的节点指针会指向节点…

汇编语言之 DUP 套 DUP

题目&#xff1a;下列变量各占多少字节。 A1 DW 23H, 5876H A2 DB 3 DUP(?), 0AH, 0DH, $ A3 DW 4 DUP(3 DUP(1, 2, AB)) 为了更直观地进行观察&#xff0c;我们编写如下程序。 DSEG SEGMENTA1 DW 23H, 5876HA2 DB 3 DUP(?), 0AH, 0DH, $A3 DW 4 DUP(3 DUP(1, 2, AB)) DSE…

函数dup和dup2

这两个函数包含在#include<unistd.h>之中。他们都是用来复制一个现有的文件描述符。 函数原型 函数功能&#xff1a;若成功返回新的文件描述符&#xff0c;否则返回-1&#xff0c;并且dup返回的文件描述符一定是当前可用文件描述符中最小的。 dup2可以用newfd指定新描述…

dup2使用

头文件&#xff1a; 参数&#xff1a; dup2是帮助我们进行重定向的系统调用接口 使用方法&#xff1a;把fd_arrays[oldfd]拷贝到fd_arrays[newfd]&#xff0c;实现重定向 原理&#xff1a; 要会使用dup2&#xff0c;要先了解文件描述符fd 文件描述符 下面这段代码就是不调用…

重定向dup和dup2

dup和dup2 返回值是int的文件描述符&#xff0c;参数是已有的文件描述符 此时打印的文件描述符为4&#xff0c;使用这个文件描述符可以访问打开的文件&#xff0c;可以通过这个往新的文件描述符写&#xff0c;主只需把打开方式改成可读可写即可。 dup2&#xff1a; 注意两个指针…