大佬博客: https://blog.csdn.net/f641385712/article/details/99725482

https://segmentfault.com/a/1190000024550434

@Validated是@Valid 的一次封装,是Spring提供的校验机制使用。@Valid不提供分组功能

https://www.lagou.com/lgeduarticle/15076.html

@Valid:

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

① 首先需要在实体类的相应字段上添加用于充当校验条件的注解,如:@Min,如下代码(age属于Girl类中的属性):

@Min(value = 18,message = "未成年禁止入内")private Integer age;

② 其次在controller层的方法的要校验的参数上添加@Valid注解,并且需要传入BindingResult对象,用于获取校验失败情况下的反馈信息,如下代码:

@PostMapping("/girls")publicGirl addGirl(@Valid Girl girl, BindingResult bindingResult) {if(bindingResult.hasErrors()){

System.out.println(bindingResult.getFieldError().getDefaultMessage());return null;

}returngirlResposity.save(girl);

}

bindingResult.getFieldError.getDefaultMessage()用于获取相应字段上添加的message中的内容,如:@Min注解中message属性的内容

@Validated:

@Valid是javax.validation里的。

@Validated是@Valid 的一次封装,是Spring提供的校验机制使用。@Valid不提供分组功能

@Validated的特殊用法

一.分组

当一个实体类需要多种验证方式时,例:对于一个实体类的id来说,新增的时候是不需要的,对于更新时是必须的。

可以通过groups对验证进行分组

分组接口类(通过向groups分配不同类的class对象,达到分组目的):

packagecom.valid.interfaces;public interfaceFirst {

}

实体类:

packagecom.valid.pojo;importjavax.validation.constraints.Size;importorg.hibernate.validator.constraints.NotEmpty;importcom.valid.interfaces.First;public classPeople {//在First分组时,判断不能为空

@NotEmpty(groups={First.class})privateString id;//name字段不为空,且长度在3-8之间

@NotEmpty

@Size(min=3,max=8)privateString name;publicString getName() {returnname;

}public voidsetName(String name) {this.name =name;

}publicString getId() {returnid;

}public voidsetId(String id) {this.id =id;

}

}

注:

(1)不分配groups,默认每次都要进行验证

(2)对一个参数需要多种验证方式时,也可通过分配不同的组达到目的。例:

@NotEmpty(groups={First.class})

@Size(min=3,max=8,groups={Second.class})private String name;

控制类:

packagecom.valid.controller;importorg.springframework.stereotype.Controller;importorg.springframework.validation.BindingResult;importorg.springframework.validation.annotation.Validated;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.ResponseBody;importcom.valid.interfaces.First;importcom.valid.pojo.People;

@Controllerpublic classFirstController {

@RequestMapping("/addPeople")//不需验证ID

public@ResponseBody String addPeople(@Validated People p,BindingResult result)

{

System.out.println("people's ID:" +p.getId());if(result.hasErrors())

{return "0";

}return "1";

}

@RequestMapping("/updatePeople")//需要验证ID

public @ResponseBody String updatePeople(@Validated({First.class}) People p,BindingResult result)

{

System.out.println("people's ID:" +p.getId());if(result.hasErrors())

{return "0";

}return "1";

}

}

注:

@Validated没有添加groups属性时,默认验证没有分组的验证属性,如该例子:People的name属性。

@Validated没有添加groups属性时,  默认验证没有分组的验证属性,  所有参数的验证类型都有分组(即本例中People的name的@NotEmpty、@Size都添加groups属性),则不验证任何参数

2、组序列

默认情况下,不同组别的约束验证是无序的,然而在某些情况下,约束验证的顺序却很重要。

例:

(1)第二个组中的约束验证依赖于一个稳定状态来运行,而这个稳定状态是由第一个组来进行验证的。

(2)某个组的验证比较耗时,CPU 和内存的使用率相对比较大,最优的选择是将其放在最后进行验证。因此,在进行组验证的时候尚需提供一种有序的验证方式,这就提出了组序列的概念。

一个组可以定义为其他组的序列,使用它进行验证的时候必须符合该序列规定的顺序。在使用组序列验证的时候,如果序列前边的组验证失败,则后面的组将不再给予验证。

分组接口类 (通过@GroupSequence注解对组进行排序):

定义分组序列

默认情况下,不管约束是属于哪个分组,它们的计算是没有特定顺序的,而在某些场景下,控制约束的计算顺序是有用的。

如:先检查汽车的默认约束,再检查汽车的性能约束,最后在开车前,检查驾驶员的实际约束。

可以定义一个接口,并用 @GroupSequence 来定义需要验证的分组的序列。

示例:

@GroupSequence({ Default.class, CarChecks.class, DriverChecks.class})public interface OrderedChecks {}

此分组用法与其它分组一样,只是此分组拥有按分组顺序校验的功能

定义序列的组和组成序列的组不能通过级联序列定义或组继承直接或间接地参与循环依赖关系。如果对包含此类循环的组计算,则会引发 GroupDefinitionException。

开发中常见的@NotNull,@NotBlank,@NotEmpty注解的区别

开发中常看见@NotNull,@NotBlank,@NotEmpty三个注解,但却没有深入了解过,下面介绍一下他们的应用场景和区别

@NotNull:主要用在基本数据类型上(Int,Integer,Double)

举例:

@NotNull(message = “年龄不能为空”)

private Integer age;

@NotBlank:主要用在String字符串上面(String)

举例:

@NotBlank(message = “名字不能为空”)

private String name;

@NotEmpty; 加了@NotEmpty注解的String类 ,Collection集合,Map ,数组,这些是不能为null或者长度为0的;(String ,Collection,Map的isEmpty()方法)

validated 验证数组_@Validated和@Valid区别相关推荐

  1. validated 验证数组_@Validated和@Valid的区别?校验级联属性(内部类)

    NBA里有两大笑话:一是科比没天赋,二是詹姆斯没技术.本文已被 https://www.yourbatman.cn 收录,里面一并有Spring技术栈.MyBatis.JVM.中间件等小而美的专栏供以 ...

  2. validated 验证数组_Spring Boot 快速入门系列(VIII)—— 数据校验篇之 @Valid @Validated...

    点击上方蓝色字体关注我吧 一起学习,一起进步,做积极的人! 场景描述: 你还在业务代码或是控制层中校验接口传入参数的有效性和合法性吗?还是只做了前端参数校验,后端接口直接放行?这样的话,程序运行的正确 ...

  3. @Validated和@Valid区别:Spring validation验证框架对入参实体进行嵌套验证必须在相应属性(字段)加上@Valid而不是@Validated...

    Spring Validation验证框架对参数的验证机制提供了@Validated(Spring's JSR-303规范,是标准JSR-303的一个变种),javax提供了@Valid(标准JSR- ...

  4. @Valid和@Validated验证List集合--网络踩坑记录

    基于Springboot框架验证list只需要一下两步: 在Controller上添加@Validated注解,方法上添加@Valid注解,就能验证了 实体类: 情况二.只是用@Valid,并且不是S ...

  5. JavaScript 数组拼接打印_JavaScript数组_创建数组_一维数组_length(二十三)

    目录: 1.什么是数组 2.创建数组方式 3.一维数组和length 一.什么是数组 数组对象的作用是:使用单独的变量名来存储一系列的值. 通俗理解:如果把声名变量来比做小轿车的话,那么数组就是高铁, ...

  6. char[]数组与char *指针的区别

    char[]数组与char *指针的区别 问题描述 虽然很久之前有看过关于char指针和char数组的区别,但是当时没有系统的整理,到现在频繁遇到,在string,char[], char *中迷失了 ...

  7. Java中 byte[]数组序列化和fastjson序列化区别

    Java中 byte[]数组序列化和fastjson序列化区别 Java中,对于对象可以通过序列化成byte数组或者序列化成json形式,这里做下两者的对比. 首先看下实现方式: 1 byte数组序列 ...

  8. 原生js使用forEach()与jquery使用each遍历数组,return false 的区别

    原生js使用forEach()与jquery使用each()遍历数组,return false 的区别: 1.使用each()遍历数组a,如下: var a=[20,21,22,23,24];$.ea ...

  9. 神奇的判断数组名和指针的区别

    神奇的判断数组名和指针的区别 代码 代码 傻傻的区分不清楚数组名和指针的区别,下面的代码可以证明指针和数组名其实不是一个东西: // An highlighted block #include< ...

最新文章

  1. Pytorch的网络结构可视化(tensorboardX)(详细)
  2. php可以实现响应式吗,怎么实现Vue数据响应式
  3. 10.3 在线学习与 MapReduce-机器学习笔记-斯坦福吴恩达教授
  4. C++ Primer 5th笔记(chap 18 大型程序工具) 多重继承与虚继承
  5. 将iphone中的照片同步到电脑
  6. maven 打包替换文件_使用Maven打包生成文件 | 学步园
  7. 如何使用SwitchyOmega.crx谷歌插件
  8. java httpclient 下载文件_httpclient 上传文件、下载文件
  9. 服务器有效设置防止web入侵
  10. WebService
  11. WebClient Exceeded limit on max bytes to buffer : 262144 异常解决
  12. android switch 使用
  13. TiDB源码学习笔记:启动TiDB
  14. linux 匿名 聊天工具,最火的几个匿名聊天app,你知道几个
  15. 李宏毅机器学习L6 GAN
  16. 小程序游戏开发三个引擎用哪个好呢 Cocos,Egret,Laya?
  17. lo流讲解 和使用(大纲)
  18. 程序猿真的觉得写代码比女朋友重要吗?
  19. Linux下载并安装rabbitmq-server-3.6.5-1.noarch.rpm
  20. 最新的虚拟机下载与安装

热门文章

  1. Cocos 2d-x CocoaChina开发者沙龙(上海站)现场放送!
  2. PHP环境、DW的站点设置
  3. Failed to execute goal on project
  4. 动态年龄判断何时触发?
  5. windows 10 系统 airpods 显示已连接但是无法播放音频
  6. 解决Airpods无法连接Win10电脑的问题
  7. Android移动应用开发——实验七——小鸭子报数(广播)
  8. async 和 await(详解)
  9. RouterOS(ROS)软路由开启UPNP设置
  10. 16G内存显示15.9G可用的解法