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 多⾏代码?通常来说,当⼀个⽅法中的⽆效业务代码量过多时,往往代码设计有问题,当然这不是我们所想看到都结果。
那么如何解决呢?⾸先⼤家应该会想到将对应的验证过程抽成⼀个验证⽅法,如下:
这样来看,我们的业务⽅法就清爽多了。
springboot是啥但这种⽅式只是抽了⼀个⽅法,有⼀种换汤不换药的感觉,虽然业务⽅法看起来清爽了很多,但书写代码量并没有下降,反⽽还多出了⼀个⽅法,这也不是我们理想中的样⼦。
此时,我们引出 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 类的属性上打上如下注解:
q.beans;
import straints.NotBlank;
import straints.NotNull;
import org.straints.Length;
import org.straints.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,具体如下:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论