首页 > 其他分享 >@Valid 与 @Validated 的区别

@Valid 与 @Validated 的区别

时间:2024-08-11 08:58:44浏览次数:11  
标签:验证 区别 class 嵌套 Valid Validated public

结论是:@Validated 基本对我无用;

@Valid与@Validated在Java开发中,特别是在进行数据校验时,扮演着重要的角色,但它们之间存在一些关键的区别。以下是对这两个注解的详细比较:

一、定义与作用范围

  1. @Valid

    • 定义:@Valid是Java EE提供的标准注解,它是JSR 303规范的一部分,主要用于Hibernate Validation等场景。
    • 作用范围:可以用在方法、构造函数、方法参数和成员属性(字段)上,支持嵌套验证,即可以验证对象内部的属性。
  2. @Validated

    • 定义:@Validated是Spring框架特有的注解,属于Spring的一部分,也是JSR 303的一个变种。它提供了一些@Valid所没有的额外功能,比如分组验证。
    • 作用范围:可以用在类、方法和方法参数上,但不能用于成员属性(字段)上,也不支持直接在成员属性上进行嵌套验证,但可以通过与@Valid结合使用来实现嵌套验证。

二、功能与特性

  1. 嵌套验证

    • @Valid:支持嵌套验证,即可以验证对象内部的其他对象属性。
    • @Validated:不支持直接在成员属性上进行嵌套验证,但可以通过在嵌套对象前加@Valid注解来实现嵌套验证。
  2. 分组验证

    • @Valid:没有分组验证功能。
    • @Validated:支持分组验证,允许在验证时指定一组特定的约束,这对于条件验证尤其有用。例如,在创建和更新对象时,可能需要应用不同的验证规则。

三、使用场景与示例

  • @Valid示例:

    public class User {
        @NotNull
        private String name;
    
        @Valid
        private Address address; // Address类内部也有需要验证的字段
    }
    
    public void createUser(@Valid User user) {
        // ...
    }
    
  • @Validated示例(分组验证):

    public interface OnCreate {}
    public interface OnUpdate {}
    
    public class User {
        @NotNull(groups = OnCreate.class)
        private String email;
    
        @NotNull(groups = OnUpdate.class)
        private String password;
    }
    
    @RestController
    @Validated
    public class UserController {
        @PostMapping("/user")
        public ResponseEntity<String> createUser(@Validated(OnCreate.class) @RequestBody User user) {
            // ...
        }
    
        @PutMapping("/user")
        public ResponseEntity<String> updateUser(@Validated(OnUpdate.class) @RequestBody User user) {
            // ...
        }
    }
    

四、总结

  • @Valid@Validated都是用于数据校验的注解,但它们在作用范围、嵌套验证和分组验证等方面存在差异。
  • @Valid更通用,支持成员属性的校验和嵌套验证;而@Validated则提供了分组验证等Spring特有的功能,且不能直接用于成员属性的校验,但可以通过与@Valid结合使用来实现更复杂的校验逻辑。
  • 在实际开发中,应根据具体需求选择合适的注解,以达到最佳的数据校验效果。

标签:验证,区别,class,嵌套,Valid,Validated,public
From: https://www.cnblogs.com/del88/p/18353049

相关文章

  • [E::bgzf_read_block] Invalid BGZF header at offset 21062256536
     001、samtools排序报错如下:[E::bgzf_read_block]InvalidBGZFheaderatoffset2106225653 问题原因:samtools转为sam格式为bam文件格式;和bam排序samtools格式不一致: a、将sam文件转换为bam文件用的samtools版本为:(base)[sy20213040737@admin2batch1]$samtools......
  • LeetCode | 20 ValidParentheses
    分析括号成对出现,键值对类型括号字符序列嵌套出现,不能错位,顺序具有对称性为什么不用数组这种数据结构来记录数量?因为这种方法不能保证括号的正确顺序。例如,字符串'({[)}]'会被认为是有效的。栈解决有效括号问题当遇到一个左括号时,我们需要记住它,以便在后续遇到相应的右括......
  • 指针常量和常量指针的区别
    1.指针常量(ConstantPointer)定义:顾名思义指针常量是一个指针,它本身是常量,指向的地址不能改变,但可以改变指针所指向的值,(速记:指针是常量)声明:在C或C++中,可以使用const关键字来声明指针常量。例如:inta=10;int*constptr=&a;行为:在这个例子中,ptr......
  • Get 和 Post 的区别?什么情况下用到
    区别:1、GET使用URL或Cookie传参。而POST将数据放在BODY中2、GET的URL会有长度上的限制,则POST的数据则可以非常大3、POST比GET安全,因为数据在地址栏上不可见最本质的区别Get是用来从服务器上获得数据,而post是用来向服务器上传递数据Get/Post使用......
  • Python time模块与datetime模块的区别
    时间方面的编程在开发过程中是很常见的,而Python提供了datetime和time这两个关于时间的模块。接下来,我们将讨论这两个模块中的函数有什么区别。time模块:如果你想要获取当前的本地时间,那么首先你需要运行time.time()来获取当下的时间戳。importtime#获取目前的时间戳ti......
  • 工厂模式与策略模式的区别及其在Java中的应用
    工厂模式与策略模式的区别及其在Java中的应用1.引言在软件开发中,设计模式被广泛应用于解决各种常见问题,提高代码的可维护性、可扩展性和可读性。工厂模式(FactoryPattern)和策略模式(StrategyPattern)是两种非常重要的设计模式,它们解决了不同的设计问题,并且在许多情况下可......
  • snap和apt的区别简单了解[]
      Linux中没有tree命令的时候提示安装的时候出现了两个命令,简单看了看两者有何区别(一般用apt就可以了):  sudosnapinstalltree 和 sudoaptinstalltree 这两个命令都是用来安装 tree 命令行工具的,但它们使用的是不同的包管理器和软件源。Snapsnap 是由Canoni......
  • 分布式存储和集中式存储的区别是什么?应用场景是什么?
    原文链接:https://www.jb51.net/blockchain/944935.html在数字领域中,会有分布式存储和集中式存储这两概念,分布式存储是指数据分布在多个存储节点上,这些节点可以位于不同的地理位置。集中式存储是指所有数据都存储在一个单一的中央服务器或数据中心中。关于这两种存储方式,很多新手......
  • java创建线程的几种方式,以及它们之间的区别(面试常用)
    线程创建的几种方法继承Thread类。如果继承了Thread类,直接new一个对象就可以创建一个线程实现Runnable接口。如果实现了Runnable接口,则还需要用Thread的构造方法,才能创建一个线程//使用Thread类创建线程并启动线程publicclassThreadTestextendsThread{@Overrid......
  • NFS v3及v4协议区别
    本文分享自天翼云开发者社区《NFSv3及v4协议区别》,作者:章****凯NFSv4相比v3,有部分功能的增强,如果应用需要实现如下功能,则必须使用NFSv4(建议和应用侧确实是否有NFSv4需求,一般情况下,应用侧会对是否采用NFSv4有明确需求):IDDomainMappingNFSv4引入Domain概念,加强了权限管控......