首页 > 其他分享 >这才是〖@Validated与@Valid〗的区别和正确用法

这才是〖@Validated与@Valid〗的区别和正确用法

时间:2023-12-08 23:32:21浏览次数:26  
标签:验证 Spring 用法 Valid 参数 注解 Validated

在 Spring 框架中,参数验证是保障数据完整性和合法性的关键步骤。@Valid 和 @Validated 是两个常用的验证注解,本文将深入分析它们的使用、原理、对比以及通过示例展示它们在实际项目中的应用。


一、 @Valid 和 @Validated 简介

1.1 @Valid

@Valid 注解属于 Java Validation API 的一部分,它通常用于标注在类或方法参数上。在 Spring MVC 中,它触发了验证机制,确保参数的合法性。

1.2 @Validated

@Validated 注解是 Spring 框架提供的,专门用于方法参数的验证。它基于 Spring 的 MethodValidationInterceptor 实现,通过 ValidatedAnnotationBeanPostProcessor 处理方法级别的验证。


二、 原理分析

2.1 @Valid 的原理

  • Spring MVC 在处理请求时,使用 LocalValidatorFactoryBean(默认情况下)进行参数验证。
  • @Valid 触发了 Java Validation API,实现了参数的验证。

2.2 @Validated 的原理

  • @Validated 通过 MethodValidationInterceptor 处理方法级别的验证。
  • ValidatedAnnotationBeanPostProcessor 为带有 @Validated 注解的 Bean 方法生成代理,实现了方法参数的验证。


三、 @Valid vs @Validated

3.1 使用场景

  • @Valid 通常用于 Spring MVC 控制器中验证请求参数。
  • @Validated 适用于对 Service 层方法参数的验证。

3.2 支持验证分组

  • @Valid 支持 Java Validation API 的分组验证。
  • @Validated 通过 groups 属性实现验证分组。


四、 示例应用

4.1 @Valid 示例

@RestController
public class UserController {

    @PostMapping("/createUser")
    public ResponseEntity<String> createUser(@Valid @RequestBody User user) {
        // 处理用户创建逻辑
        return ResponseEntity.ok("User created successfully");
    }
}

4.2 @Validated 示例

@Service
@Validated
public class UserService {

    public void updateUser(@Validated(UpdateGroup.class) User user) {
        // 处理用户更新逻辑
    }
}

五、 总结

@Valid 和 @Validated 在 Spring 中都是关键的参数验证注解,根据具体场景选择使用。@Valid 更适用于 Spring MVC 控制器中,而 @Validated 则更专注于 Service 层方法参数的验证。通过深入理解它们的原理和对比,开发者能够更好地利用它们提供的验证机制,确保应用程序的数据完整性和合法性。

通过合理运用这两个注解,可以提高代码的可读性和维护性,确保数据在传递和处理过程中的合法性,是构建高质量应用的不可或缺的一环。


标签:验证,Spring,用法,Valid,参数,注解,Validated
From: https://blog.51cto.com/u_3383071/8742184

相关文章

  • Vue路由params、query传参用法,以及form表单回车自动提交问题
    一、路由参数用法1.1query参数第一种方式传参:跳转路由并携带query参数,注意to的字符串写法将id和title拼接字符串形成地址<router-link:to="`/home/message/detail?id=${item.id}&title=${item.title}`">{{item.title}}</router-link>&nbsp;&nbsp;第二种方式传参:to......
  • 在Python中,​​type()​​函数有两种用法
    在Python中,type()函数有两种用法¹²³⁴⁵:查看数据类型:当type()函数只有一个参数时,它会返回该参数的数据类型¹²³⁴⁵。例如:x=123print(type(x))#输出:<class'int'>在这个例子中,type(x)返回了x的数据类型,即<class'int'>,表示x是一个整数¹²³⁴⁵。动态创建类:当type()函......
  • C# static的用法详解
    https://www.cnblogs.com/baxianhua/p/9082820.html 有的东西你天天在用,但未必就代表你真正了解它,正如我之前所了解的static。一、静态类静态类与非静态类的重要区别在于静态类不能实例化,也就是说,不能使用new关键字创建静态类类型的变量。在声明一个类时使用static关......
  • java 正则表达式 用法
    在一个复杂的字符串中,使用正则表达式来取其中某个值importjava.util.regex.*;//正则表达式引用//复杂的字符串Stringinput="{\"pbxToken\":\"1ja930jsdlij912h94hk5l35poeweer\"}"+"{\"LS_CallStatus_Event_Type\":\"\",\"callId......
  • Mockito When/Then常见用法
    MockitoWhen/Then常见用法该系列文章翻译自https://www.baeldung.com/mockito-series接下来我们将以MyList类为例进行介绍publicclassMyListextendsAbstractList<String>{@OverridepublicStringget(finalintindex){returnnull;}@Over......
  • 转:ROW_NUMBER() OVER函数的基本用法
    ROW_NUMBER()OVER函数的基本用法 分组后排序    在oracle中分组倒叙排序,取出每一组的第一个值,如何通过ROW_NUMBER()OVER实现 ChatGPTChatGPT在Oracle中,你可以使用ROW_NUMBER()窗口函数结合PARTITIONBY和ORDERBY子句来实现......
  • MyBatis的10种高级用法
    目录用来循环容器的标签forEach,查看例子concat模糊查询choose(when,otherwise)标签selectKey标签if标签if+where的条件判断if+set实现修改语句if+trim代替where/set标签foreach用来循环容器的标签forEachforeach元素的属性主要有item,index,collection,open,sep......
  • CMC-ORACLE-函數row_number() over(partition by )函数用法
    row_number()over(partitionby)函数用法row_number()over(partitionby),作为oracle常用的分析函数,身为数据开发时必须要掌握的。不过一段时间不用,难免会有些忘记,今天整理一下一些场景下的用法。现有表(test_rownumber)有如下数据:RUSER(用户名)RID(用户编号)RSAL(用户消费)RD......
  • python assert用法
    python中assert用法。具体分析如下1、assert语句用来声明某个条件是真的。2、如果你非常确信某个你使用的列表中至少有一个元素,而你想要检验这一点,并且在它非真的时候引发一个错误,那么assert语句是应用在这种情形下的理想语句。3、当assert语句失败的时候,会引发一AssertionEr......
  • python中for循环用法
    1、在python中完整的for语法如下#for变量in集合:#循环代码#else:#没有通过的break退出循环,结束后会执行代码2、应用场景在迭代变量嵌套的数据类型时,列表【数组】中包括多个字典【键值对存放的值:用{key:value}】需求:要判断某一个字典中是否存在......