springboot @Valid 注解用法详解

springboot @Valid 注解用法详解

@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")

@ResponseBody

public String add(Employee employee) {

// TODO 保存到数据库

return "新增员工成功";

}

}

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

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

(1)名称为空情况

(2)正常情况

(3)超过长度情况

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

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

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

那么如何解决呢?首先大家应该会想到将对应的验证过程抽成一个验证方法,如下:

这样来看,我们的业务方法就清爽多了。

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

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

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

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

org.springframework.boot

spring-boot-starter-web

2.0.5.RELEASE

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

javax.validation

validation-api

1.1.0.Final

org.hibernate

hibernate-validator

5.4.1.Final

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

首先我们在 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 ! 万事俱备 !我们进行测试下:

(1)名称为空

(2)名称正常,年龄为空

(3)名称超出范围,年龄正常

(4)名称正常,年龄超出范围

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

常用注解:

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

原文地址:https://blog.csdn.net/sunnyzyq/article/details/103527380

🎯 相关推荐

环球时报社评:这份白皮书是中国对全球反恐的重大贡献
最后的单词怎么写
比分365网页版

最后的单词怎么写

📅 09-07 👁️ 4760
如何制作书签
bte365官网

如何制作书签

📅 09-05 👁️ 1922
重磅!国家药监局新政为创新药
众祥商务多久能到账啊,正好饿啊
bte365官网

众祥商务多久能到账啊,正好饿啊

📅 07-15 👁️ 1398
十四五规划编制流程、框架、程序、重点、技术方法及建议