Spring Validation验证框架对参数的验证机制提供了@Validated(Spring's JSR-303规范,是标准JSR-303的一个变种),javax提供了@Valid(标准JSR-303规范),配合BindingResult可以直接提供参数验证结果。其中对于字段的特定验证注解比如@NotNull等网上到处都有,这里不详述

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

1. 分组

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

2. 注解地方

@Validated:可以用在类型、方法和方法参数上。但是不能用在成员属性(字段)上

@Valid:可以用在方法、构造函数、方法参数和成员属性(字段)上

两者是否能用于成员属性(字段)上直接影响能否提供嵌套验证的功能。

3. 嵌套验证

在比较两者嵌套验证时,先说明下什么叫做嵌套验证。比如我们现在有个实体叫做Item:

public class Item {
<span style="color:#bbb529;">@NotNull</span>(<span style="color:#d0d0ff;">message </span>= <span style="color:#6a8759;">"id不能为空"</span>)
<span style="color:#bbb529;">@Min</span>(<span style="color:#d0d0ff;">value </span>= <span style="color:#6897bb;">1</span><span style="color:#cc7832;">, </span><span style="color:#d0d0ff;">message </span>= <span style="color:#6a8759;">"id必须为正整数"</span>)
<span style="color:#cc7832;">private </span>Long <span style="color:#9876aa;">id</span><span style="color:#cc7832;">;

@NotNull(message = "props不能为空")

@Size(min = 1, message = "至少要有一个属性")

private List<Prop> props;

}

Item带有很多属性,属性里面有属性id,属性值id,属性名和属性值,如下所示:

public class Prop {
<span style="color:#bbb529;">@NotNull</span>(<span style="color:#d0d0ff;">message </span>= <span style="color:#6a8759;">"pid不能为空"</span>)
<span style="color:#bbb529;">@Min</span>(<span style="color:#d0d0ff;">value </span>= <span style="color:#6897bb;">1</span><span style="color:#cc7832;">, </span><span style="color:#d0d0ff;">message </span>= <span style="color:#6a8759;">"pid必须为正整数"</span>)
<span style="color:#cc7832;">private </span>Long <span style="color:#9876aa;">pid</span><span style="color:#cc7832;">;

@NotNull(message = "vid不能为空")

@Min(value = 1, message = "vid必须为正整数")

private Long vid;



@NotBlank(message = "pidName不能为空")

private String pidName;



@NotBlank(message = "vidName不能为空")

private String vidName;

}

属性这个实体也有自己的验证机制,比如属性和属性值id不能为空,属性名和属性值不能为空等。

现在我们有个ItemController接受一个Item的入参,想要对Item进行验证,如下所示:


@RestController

public class ItemController {
<span style="color:#bbb529;">@RequestMapping</span>(<span style="color:#6a8759;">"/item/add"</span>)
<span style="color:#cc7832;">public void </span><span style="color:#ffc66d;">addItem</span>(<span style="color:#bbb529;">@Validated </span>Item item<span style="color:#cc7832;">, </span>BindingResult bindingResult) {
doSomething()<span style="color:#cc7832;">;

}

}

在上图中,如果Item实体的props属性不额外加注释,只有@NotNull和@Size,无论入参采用@Validated还是@Valid验证,Spring Validation框架只会对Item的id和props做非空和数量验证,不会对props字段里的Prop实体进行字段验证,也就是@Validated和@Valid加在方法参数前,都不会自动对参数进行嵌套验证。也就是说如果传的List<Prop>中有Prop的pid为空或者是负数,入参验证不会检测出来。

为了能够进行嵌套验证,必须手动在Item实体的props字段上明确指出这个字段里面的实体也要进行验证。由于@Validated不能用在成员属性(字段)上,但是@Valid能加在成员属性(字段)上,而且@Valid类注解上也说明了它支持嵌套验证功能,那么我们能够推断出:@Valid加在方法参数时并不能够自动进行嵌套验证,而是用在需要嵌套验证类的相应字段上,来配合方法参数上@Validated或@Valid来进行嵌套验证。

我们修改Item类如下所示:

public class Item {
<span style="color:#bbb529;">@NotNull</span>(<span style="color:#d0d0ff;">message </span>= <span style="color:#6a8759;">"id不能为空"</span>)
<span style="color:#bbb529;">@Min</span>(<span style="color:#d0d0ff;">value </span>= <span style="color:#6897bb;">1</span><span style="color:#cc7832;">, </span><span style="color:#d0d0ff;">message </span>= <span style="color:#6a8759;">"id必须为正整数"</span>)
<span style="color:#cc7832;">private </span>Long <span style="color:#9876aa;">id</span><span style="color:#cc7832;">;

@Valid // 嵌套验证必须用@Valid

@NotNull(message = "props不能为空")

@Size(min = 1, message = "props至少要有一个自定义属性")

private List<Prop> props;

}

然后我们在ItemController的addItem函数上再使用@Validated或者@Valid,就能对Item的入参进行嵌套验证。此时Item里面的props如果含有Prop的相应字段为空的情况,Spring Validation框架就会检测出来,bindingResult就会记录相应的错误。

总结一下@Validated和@Valid在嵌套验证功能上的区别:

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

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

原文地址:https://blog.csdn.net/qq_27680317/article/details/79970590

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

  1. 公司框架将入参Map化

    1.Map<String,Object> map = BeanUtil.describe(inDto);

  2. 学习Validator验证框架总结

    在项目开发中许多地方需要加以验证,对于使用if-else简单粗暴一个一个验证,spring的validation封装了Javax ValidationI校验参数,大大缩减了代码量. 以前的分层验证,从 ...

  3. struts2学习笔记(三)—— 在用户注冊程序中使用验证框架

    实现目标:       1.使用验证框架对用户注冊信息进行验证       2.验证username.password.邮箱不能为空       3.验证username.password长度     ...

  4. Jodd-vtor验证框架

    VTor是一个编程式验证框架,适用于任意java对象的验证.它是一个快速.微型的.专注于验证的框架.也可以通过注解或者手动设置验证条件.验证条件也可以在profile中分组.VTor是可扩展的,用户很 ...

  5. 【转】jquery validate验证框架与kindeditor使用需二次提交的问题

    原文:http://blog.csdn.net/wlsyn/article/details/11536399在使用jquery的验证框架对kindeditor富文本编辑器进行验证的过程中,发现提 交时 ...

  6. Hibernate Validation,Spring mvc 数据验证框架注解

    1.@NotNull:不能为 Null,但是可以为Empty:用在基本数据类型上. @NotNull(message="{state.notnull.valid}", groups ...

  7. SpringMVC 使用验证框架 Bean Validation(上)

    SpringMVC 使用验证框架 Bean Validation(上) 对于任何一个应用而言在客户端做的数据有效性验证都不是安全有效的,这时候就要求我们在开发的时候在服务端也对数据的有效性进行验证. ...

  8. @Validated和@Valid区别

    注解地方 @Validated:可以用在类型.方法和方法参数上.但是不能用在成员属性(字段)上 @Valid:可以用在方法.构造函数.方法参数和成员属性(字段)上 两者是否能用于成员属性(字段)上直接 ...

  9. java bean 属性验证框架 valid

    项目介绍 java 开发中,参数校验是非常常见的需求. 但是 hibernate-validator 在使用过程中,依然会存在一些问题. 特性 支持 fluent-validation 支持 jsr- ...

随机推荐

  1. Java-技术专区-如何监控Java线程池的状态

    线程池介绍 什么是线程池.线程池核心类.线程池工作流程.线程池分类.拒绝策略.及如何提交与关闭线程池等. 但在实际开发过程中,在线程池使用过程中可能会遇到各方面的故障,如线程池阻塞,无法提交新任务等. ...

  2. Provider

    import React from 'react';import PropTypes from 'prop-types'; class Provider extends React.Component ...

  3. 在linux中出现there are stopped jobs 的解决方法【转自:http://www.linuxdiyf.com/viewarticle.php?id=104604】

    在用管理员执行一个命令后,我用Ctrl+Z把命令转移到了后台天.导致我无法退出root的. 输入命令:logout终端显示:There are stopped jobs. 解决方法:输入命令:jobs ...

  4. Qt 显示网页的控件

    Qt5.6以下的版本,基于QtWebkit控件Qt5.6以上的MSVC版本,基于 Chromium 的浏览器引擎 Qt WebEngineQt5.6以上的mingw 版本,只能采用QAxWidget ...

  5. ATM&购物商城程序

    模拟实现一个ATM + 购物商城程序 额度15000或自定义 实现购物商城,买东西加入购物车,调用信用卡接口转账 可以体现,手续费5% 支持多账户登录 支持账户间转账 记录每月日常消费流水 提供还款接 ...

  6. setattr(object, name, value)¶

    This is the counterpart of getattr(). The arguments are an object, a string and an arbitrary value. ...

  7. Django 与 Flask框架的比较

    Django Django恐怕是最有代表性的Python框架了.它是一个遵循MMVC架构模式的开源框架.它的名字来自Django Reinhardt,一个法国作曲家和吉他演奏家,很多人认为他是历史上最 ...

  8. Spring中自动装配的模式

    原创转载请注明出处:https://www.cnblogs.com/agilestyle/p/11484037.html 自动装配模式 Reference https://docs.spring.io ...

  9. UNP学习 广播

    一.概述 虽然UDP支持各种形式的地址,但TCP只支持单播地址. 上图要点是: IPv4对多播的支持是可选的,而IPv6则时必须的. IPv6没有提供对广播的支持:当使用广播的IPv4应用程序一直到I ...

  10. 10个优秀的 Web UI库/框架

    UI(User Interface)即用户界面,也称人机界面.是指用户和某些系统进行交互方法的集合,实现信息的内部形式与人类可以接受形式之间的转换.本文为WUI用户整理了10个优秀的 Web UI 库 ...