第五节:数据验证

有数据输入,就必然涉及到数据的验证以及数据验证失败后的处理。本节中,让我们共同学习SpringMVC是如何进行数据验证的。

通过上节的学习,我们得知,SpringMVC通过@RequestBody注解将请求数据绑定到相应的实体中(对象)。数据绑定,其实是利用实体的set方法进行了赋值的过程。数据的验证的过程我们也放置于此。

我们找到Teacher实体,使用注解的方法设置如下验证规则:

    @Column(length = 25)            // 声明字段的长度为25
    @Size(min = 2, max = 25)        // 最小长度为2(不能为空),最大长度为25
    private String name = "";       // 姓名

    @Column(length = 50)
    @NotNull                        // 此列不能为空
    @Email                          // 邮箱验证
    @Size(max = 50)                 // 最大长度为50
    private String email = "";      // 邮箱

    @Size(max = 255)                // 最大长度为255
    private String address = "";    // 地址. 不进行@Column声明,则默认长度为255

完整代码如下:

package com.mengyunzhi.repository;


import org.hibernate.validator.constraints.Email;

import javax.persistence.*;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

/**
 * Created by panjie on 17/4/5.
 */
// 使用@Entity 来说明该类对应一个数据表
@Entity
public class Teacher {
    //    声明主键
    @Id
    //    声明主键生成策略为 自动
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Column(length = 25)            // 声明字段的长度为25
    @Size(min = 2, max = 25)        // 最小长度为2(不能为空),最大长度为25
    private String name = "";       // 姓名

    @Column(length = 50)
    @NotNull                        // 此列不能为空
    @Email                          // 邮箱验证
    @Size(max = 50)                 // 最大长度为50
    private String email = "";      // 邮箱

    @Size(max = 255)                // 最大长度为255
    private String address = "";    // 地址. 不进行@Column声明,则默认长度为255

    private Boolean sex = false;    // 性别:false(0),男。true(1),女.

    public void setId(Long id) {
        this.id = id;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public void setSex(Boolean sex) {
        this.sex = sex;
    }

    public Long getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public String getEmail() {
        return email;
    }

    public String getAddress() {
        return address;
    }

    public Boolean getSex() {
        return sex;
    }

    public Teacher(String name, String email, String address, Boolean sex) {
        this.name = name;
        this.email = email;
        this.address = address;
        this.sex = sex;
    }

    public Teacher() {
    }

    @Override
    public String toString() {
        return "Teacher{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", email='" + email + '\'' +
                ", address='" + address + '\'' +
                ", sex=" + sex +
                '}';
    }
}

重新启动应用:


正常数据:

validate


姓名过短:

validate name


邮箱格式不合法:

validate email

其它的自行验证一下吧。

格式化验证错误信息

前面,我们虽然得到了错误的验证信息,但是错误的信息全部在message字段中,这无疑为我们前台排错增加了一定的难度。SpringMVC当然想到了这点。 我们打开TeacherController控制器,为saveTeacher方法增加一个@Valid注解,并重新启动应用。

    ...
    public Teacher saveTeacher(@Valid @RequestBody Teacher teacher) {
    ...

该注解位于:javax.validation.Valid;

此时,当我们再次发送一些数据而未验证成功时,将得到如下的错误信息:

validate format

没错,这就是我们想要的。

参考官方文档: https://spring.io/guides/gs/validating-form-input/ http://hibernate.org/validator/ https://www.ibm.com/developerworks/cn/java/j-lo-jsr303/ https://docs.spring.io/spring/docs/4.3.7.RELEASE/spring-framework-reference/html/validation.html