写点什么

参数校验 Spring 的 @Valid 注解用法详解

作者:JavaEdge
  • 2022 年 1 月 24 日
  • 本文字数:1282 字

    阅读完需:约 4 分钟

@Valid 注解通常用于对象属性字段的规则检测。


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


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


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():


@Controllerpublic class TestController {     @RequestMapping("/add")    @ResponseBody    public 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>
复制代码


代码优化。首先在 Employee 类的属性上打上如下注解:


import javax.validation.constraints.NotBlank;import javax.validation.constraints.NotNull; import org.hibernate.validator.constraints.Length;import org.hibernate.validator.constraints.Range;
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:



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



发布于: 刚刚阅读数: 2
用户头像

JavaEdge

关注

正在征服世界的 Javaer。 2019.09.25 加入

曾就职于百度、携程、华为等大厂,阿里云开发者社区专家博主、腾讯云+社区2019、2020年度最佳作者、慕课网认证作者、CSDN博客专家,简书优秀创作者兼《程序员》专题管理员,牛客网著有《Java源码面试解析指南》。

评论

发布
暂无评论
参数校验Spring的@Valid注解用法详解