Spring Validation验证框架对参数的验证机制提供了@Validated(Spring's JSR-303规范,是标准JSR-303的一个变种),javax提供了@Valid(标准JSR-303规范),配合BindingResult可以直接提供参数验证结果。

@Valid属于javax.validation包下,是jdk给提供的 是使用Hibernate validation的时候使用

@Validated是org.springframework.validation.annotation包下的,是spring提供的 是只用Spring Validator校验机制使用

说明:java的JSR303声明了@Valid这类接口,而Hibernate-validator对其进行了实现

@Validation对@Valid进行了二次封装,在使用上并没有区别,但在分组、注解位置、嵌套验证等功能上有所不同,这里主要就这几种情况进行说明。

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

  1. 分组

@Validated:提供了一个分组功能,可以在入参验证时,根据不同的分组采用不同的验证机制,这个网上也有资料,不详述。@Valid:作为标准JSR-303规范,还没有吸收分组的功能。

  1. 注解地方

@Validated:用在类型、方法和方法参数上。但不能用于成员属性(field)

@Valid:可以用在方法、构造函数、方法参数和成员属性(field)上 所以可以用@Valid实现嵌套验证

<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.7.Final</version>
</dependency>
public class Param {
@Min(20)
int a; public int getA() {
return a;
} public void setA(int a) {
this.a = a;
}
}

@Valid验证情况1:

/**
* 有实现类hibernate-validator的情况生效,无实现类的情况下不生效(也不报错)
* @param param
* @return
*/
@PostMapping("/get")
public String get(@Valid @RequestBody Param param) {
System.out.println(param.getA());
return param.getA() + "ss";
}



@Valid验证情况2:

/**
* 有无实现类hibernate-validator的情况均不生效,因为只能对Object的属性进行校验,不能对单个的参数进行校验
* @param a
* @return
*/
@GetMapping("/test")
public String get(@Valid @Min(20) int a) {
System.out.println(a);
return a + "ss";
}

@Validated验证情况1:

/**
* 有实现类hibernate-validator的情况生效,无实现类的情况下不生效(也不报错)所以底层还是用的hibernate-validator实现
* @param param
* @return
*/
@PostMapping("/get")
public String get(@Validated @RequestBody Param param) {
System.out.println(param.getA());
return param.getA() + "ss";
}

Spring validator 方法级别的校验

JSR和Hibernate validator的校验只能对Object的属性进行校验,不能对单个的参数进行校验,spring 在此基础上进行了扩展,添加了MethodValidationPostProcessor拦截器,可以实现对方法参数的校验,实现如下:

https://www.cnblogs.com/softidea/p/12192444.html

1、实例化MethodValidationPostProcessor(springboot项目不用手动添加,框架自动装配bean

@Bean
public MethodValidationPostProcessor methodValidationPostProcessor() {
returnnew MethodValidationPostProcessor();
}

2、在所要实现方法参数校验的类上面添加@Validated,如下

/**
* @Validated注解必须放在类上面,否则单方法参数校验不生效
* 官方说明:方法里写有JSR校验注解要想其生效的话,要求类型级别上必须使用@Validated标注(还能指定验证的Group)
* https://docs.spring.io/spring-framework/docs/5.3.8-SNAPSHOT/reference/html/core.html#validation-beanvalidation-spring-method
*/
@RestController
@RequestMapping("/t2")
@Validated
public class Test2Controller {
}

3、在方法上面添加校验规则:

@GetMapping("/test")

public String get(@Min(20) int a) {

System.out.println(a);

return a + "ss";

}

当方法上面的参数校验失败,spring 框架就回抛出异常

{

"timestamp": "2021-05-19T11:28:24.967+00:00",

"status": 500,

"error": "Internal Server Error",

"message": "",

"path": "/t2/test"

}

https://blog.csdn.net/herojuice/article/details/86020101

@Valid和@Validated 区别的更多相关文章

  1. Spring中的@Valid 和 @Validated注解你用对了吗

    1.概述 本文我们将重点介绍Spring中 @Valid和@Validated注解的区别 . 验证用户输入是否正确是我们应用程序中的常见功能.Spring提供了@Valid和@Validated两个注 ...

  2. Xcode的Architectures和Valid Architectures的区别,

    登录 | 注册 ys410900345的专栏 目录视图摘要视图订阅 学院APP首次下载,可得50C币!     欢迎来帮助开源“进步”     当讲师?爱学习?投票攒课吧     CSDN 2015博 ...

  3. Spring @Valid 和 @Validated 的区别和使用

    两者区别 @Valid @Validated 标准 标准JSR-303规范 增强JSR-303规范 包 javax.validation org.springframework.validation ...

  4. @Valid与@Validated

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

  5. spring注解第07课 @Valid和@Validated的总结区分

    @Valid: @Valid注解用于校验,所属包为:javax.validation.Valid. ① 首先需要在实体类的相应字段上添加用于充当校验条件的注解,如:@Min,如下代码(age属于Gir ...

  6. springboot @valid与@validated的参数校验使用总结

    好久没在这平台写博客了,最近整理了这东西,先给出总结 // @Valid只能用在controller,@Validated可以用在其他被spring管理的类上 // @Valid可以加在成员变量上(本 ...

  7. Spring Validation最佳实践及其实现原理,参数校验没那么简单!

    之前也写过一篇关于Spring Validation使用的文章,不过自我感觉还是浮于表面,本次打算彻底搞懂Spring Validation.本文会详细介绍Spring Validation各种场景下 ...

  8. 使用SpringBoot进行优雅的数据验证

    JSR-303 规范 在程序进行数据处理之前,对数据进行准确性校验是我们必须要考虑的事情.尽早发现数据错误,不仅可以防止错误向核心业务逻辑蔓延,而且这种错误非常明显,容易发现解决. JSR303 规范 ...

  9. @Validated和@Valid的区别?校验级联属性(内部类)

    每篇一句 NBA里有两大笑话:一是科比没天赋,二是詹姆斯没技术 相关阅读 [小家Java]深入了解数据校验:Java Bean Validation 2.0(JSR303.JSR349.JSR380) ...

随机推荐

  1. Basic remains java入门题

    Basic remains input:   b p m    读入p进制的p,m,   求p%m   ,以b进制输出 1 import java.util.*; 2 import java.math ...

  2. centos 8.3系统调优参数配置

    临时设置 最大虚拟内存 [root@Sonnarqube-dev ~]# sysctl -w vm.max_map_count=262144 执行结果 vm.max_map_count = 26214 ...

  3. CentOS-安装node_exporter导出机器指标

    注:node_exporter导出机器指标配合 Grafana+Prometheus使用,可参考:远程监控服务器指标 创建相关目录 $ mkdir /home/prometheus/ -p $ cd ...

  4. Spring:Spring项目多接口实现类报错找不到指定类

    spring可以通过applicationContext.xml进行配置接口实现类 applicationContext.xml中可以添加如下配置: 在application.properties中添 ...

  5. SpringBoot:SpringBoot项目中 HttpServletRequest ServletInputStream 读取不到文件数据流

    在Springboot程序启动后,会默认添加OrderedCharacterEncodingFilter和HiddenHttpMethodFilter过滤器.在HiddenHttpMethodFilt ...

  6. 在 Docker 上配置 Oracle

    地址:https://github.com/wnameless/docker-oracle-xe-11g .直接 git clone 到本地就行了 ##安装 docker shell 下: docke ...

  7. Jquery Validate动态添加和删除校验规则

    以下面文本框为例, <input type="text"name="username" id="username"/> 我们要让 ...

  8. php漏洞 strcmp漏洞

    0x01: 背景:strcmp函数,参数是两个字符串,相等返回为零,大于,返回大于零,小于,返回小于零. 0x02: 如果传入的值,不是字符串的话,会报错,同时使得两个字符串直接相等,返回为零. 一般 ...

  9. Spring RestTemplate 之exchange方法

    ●exchange方法提供统一的方法模板进行四种请求:POST,PUT,DELETE,GET (1)POST请求 String reqJsonStr = "{\"code\&quo ...

  10. 在Linux下安装node及npm

    1.解压 # tar Jxf node-v12.18.3-linux-x64.tar.xz 2.移动到指定目录 # mv node-v12.18.3-linux-x64  /usr/local/nod ...