@Valid 注解通常用于对象属性字段的规则检测,具体啥意思,下面让我娓娓道来:

下面我们以新增一个员工为功能切入点,以常规写法为背景,慢慢烘托出 @Valid 注解用法详解。

那么,首先,我们会有一个员工对象 Employee,如下 :

/*** 员工对象* * @author sunnyzyq* @since 2019/12/13*/
public class Employee {/** 姓名 */public String name;/** 年龄 */public Integer age;public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}}

然后 Cotroller 中会有一个对应都新增方法 add(),如下:


@Controller
public class TestController {@RequestMapping("/add")@ResponseBodypublic String add(Employee employee) {// TODO 保存到数据库return "新增员工成功";}}

现在要求:员工的名称不能为空,且长度不能超过10个字符,那么我们以前的做法大致如下:

写完,我们启动项目测试下:

可以看到,和我们料想中的一样,毫无问题。

除了名称外,我们规定年龄也是必填项,且范围在1到100岁,那么此时,我们需要增加对应判定代码如下:

那么问题来了,现在员工对象 Employee 就 2 个字段,我们就写了 10 多行的代码验证,要是有20个字段,岂不是要写 100 多行代码?通常来说,当一个方法中的无效业务代码量过多时,往往代码设计有问题,当然这不是我们所想看到都结果。

那么如何解决呢?首先大家应该会想到将对应的验证过程抽成一个验证方法,如下:
这样来看,我们的业务方法就清爽多了。

但这种方式只是抽了一个方法,有一种换汤不换药的感觉,虽然业务方法看起来清爽了很多,但书写代码量并没有下降,反而还多出了一个方法,这也不是我们理想中的样子。

此时,我们引出 Spring 中的 @valid 注解,这些问题就可以迎刃而解了,具体如下:

首先,我们在 Maven 配置中引入 @valid 的依赖:

如果你是 springboot 项目,那么可以不用引入了,已经引入了,他就存在于最核心的 web 开发包里面。

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.0.5.RELEASE</version>
</dependency>

如果你不是 springboot 项目,那么引入下面依赖即可:

<dependency><groupId>javax.validation</groupId><artifactId>validation-api</artifactId><version>1.1.0.Final</version>
</dependency><dependency><groupId>org.hibernate</groupId><artifactId>hibernate-validator</artifactId><version>5.4.1.Final</version>
</dependency>

那么针对上面情景,我们可以对我们的代码进行优化了。

首先我们在 Employee 类的属性上打上如下注解:

package com.zyq.beans;import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.Range;/*** 员工对象* * @author sunnyzyq* @since 2019/12/13*/
public class Employee {/** 姓名 */@NotBlank(message = "请输入名称")@Length(message = "名称不能超过个 {max} 字符", max = 10)public String name;/** 年龄 */@NotNull(message = "请输入年龄")@Range(message = "年龄范围为 {min} 到 {max} 之间", min = 1, max = 100)public Integer age;public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}}

然后再 Controller 对应方法上,对这个员工标上 @Valid 注解,表示我们对这个对象属性需要进行验证,

既然验证,那么就肯定会有验证结果,所以我们需要用一个东西来存放验证结果,做法也很简单,在参数直接添加一个BindingResult,具体如下:

对应获取验证结果的代码如下:

OK ! 万事俱备 !我们进行测试下:

可以看到,代码不但简洁了很多,结果和预期的也一模一样!很棒吧!!

常用注解:

除了刚刚都注解,最后再附加2个常用注解,我就直接贴图了,基本上这6个注解可以解决99%的字段,其他注解我就不贴图了,如果不满足,自己问百度。

@Valid的用法详解相关推荐

  1. springboot @Valid 注解用法详解

    @Valid 注解通常用于对象属性字段的规则检测,具体啥意思,下面让我娓娓道来: 下面我们以新增一个员工为功能切入点,以常规写法为背景,慢慢烘托出 @Valid 注解用法详解. 那么,首先,我们会有一 ...

  2. SpringBoot从入门到精通教程(二十七)- @Valid注解用法详解+全局处理器Exception优雅处理参数验证用法

    问题痛点 用 Spring 框架写代码时,写接口类,相信大家对该类的写法非常熟悉.在写接口时要写效验请求参数逻辑,这时候我们会常用做法是写大量的 if 与 if else 类似这样的代码来做判断,如下 ...

  3. springboot@Valid注解用法详解

    目录 一.@Valid注解的作用 二.@Valid注解的用法 三.更多实体类的校验注解如下 一.@Valid注解的作用 @Valid用于对象属性的检测,可以极大减少代码量,具体看我下面我娓娓道来 现有 ...

  4. @Valid 和 @Validated 注解用法详解

    目录 案例引入 @Valid 详解 @Validated 详解 @Valid 和 @Validated 比较 案例引入 下面我们以新增一个员工为功能切入点,以常规写法为背景,慢慢烘托出 @Valid ...

  5. jQuery 表单验证插件,jQuery Validation Engine用法详解

    jQuery 表单验证插件,jQuery Validation Engine用法详解 功能强大的 jQuery 表单验证插件,适用于日常的 E-mail.电话号码.网址等验证及 Ajax 验证,除自身 ...

  6. python中permute_PyTorch中permute的用法详解

    PyTorch中permute的用法详解 permute(dims) 将tensor的维度换位. 参数:参数是一系列的整数,代表原来张量的维度.比如三维就有0,1,2这些dimension. 例: i ...

  7. python argv 详解_Python3 sys.argv[ ]用法详解

    sys.argv[]说白了就是一个从程序外部获取参数的桥梁,这个"外部"很关键,因为我们从外部取得的参数可以是多个,所以获得的是一个列表(list),也就是说sys.argv其实可 ...

  8. oracle中的exists 和 not exists 用法详解

    from:http://blog.sina.com.cn/s/blog_601d1ce30100cyrb.html oracle中的exists 和 not exists 用法详解 (2009-05- ...

  9. ROW_NUMBER() OVER()函数用法详解 (分组排序 例子多)

    ROW_NUMBER() OVER()函数用法详解 (分组排序 例子多) https://blog.csdn.net/qq_25221835/article/details/82762416 post ...

最新文章

  1. python0.1+0.2不等于0.3_为什么0.1 + 0.2不等于0.3?
  2. 配置tomcat8数据源(采用局部数据源方式)
  3. Spring中基于Java的配置@Configuration和@Bean用法
  4. 【数据结构与算法】之深入解析“丑数”的求解思路与算法示例
  5. ADN中国队参加微软Kinect他赢得了全国比赛三等奖,我们的创意项目与团队Kinect于Naviswork虚拟之旅...
  6. 手动封装element-ui里面的button组件
  7. linux限制ping的时间,如何限制Linux命令程序运行的时间
  8. js基础——function类型
  9. Atitit mybatis 翻页解决法 目录 1.1. 翻页模式还有js翻页前端翻页更加简单 1 1.2. 逻辑分页使用类RowBounds vs 物理分页 offset模式 1 1.3.
  10. 方舟生存计划怎么删除服务器信息,方舟服务器怎么删除玩家数据 | 手游网游页游攻略大全...
  11. c++编译时出现discards qualifiers [-fpermissive]的错误
  12. Netty in Action 翻译说明
  13. 2022软件测试技能 Mysql数据库必会知识点总结
  14. windows保护无法启动修复服务器,如何解决win10“Windows资源保护无法启动修复服务”错误 | MOS86...
  15. 视易服务器系统装,windows2000视易星云点歌数据服务器安装方法和步骤.docx
  16. JavaScript实时获取现货黄金,白银,美元指数价格代码
  17. 包(package)是什么?
  18. MySql数据库练习01
  19. 新手福利——理解java多态的概念和作用
  20. 聚焦绿色发展新赛道—MapGIS智慧环保解决方案发布

热门文章

  1. 谈笑间学会大数据-Hive中的排序
  2. 2022深信服Python开发岗面试
  3. codemirror 使用总结
  4. JavaWeb之【转发与重定向】
  5. 通信工程专业学生走进C语言
  6. Android-搜索关键字飞入飞出动画
  7. LightGBM原理
  8. Vue中form表单提交问题
  9. Flutter绘制弧线
  10. 股份有限公司注册资金最少是多少