《SpringMVC从入门到放肆》十四、SpringMVC分组数据校验

2019-05-25 16:17:24 浏览数 (1)

上一篇我们学习了数据校验,但是在实际项目中,还是有些不够灵活,今天我们就来继续学习一种更灵活的数据校验方法——分组数据校验。

一、什么是分组校验

校验规则是定义在实体中的,而同一个实体可以被多个Controller使用,此时就会有问题,即:不同的Controller方法对同一个实体进行校验,此时这些校验信息是共享在这不同的Controller方法中的,但是实际上每个Controller方法可能需要不同的校验,在这种情况下,就需要使用分组校验来解决这种问题。

或者说,一个实体中有很多属性,Controller中的方法一可能只需要校验实体中的属性1和属性2,而Controller中的方法二可能只需要校验实体中的属性3和属性4。这样的需求就需要用到分组校验了。

二、定义分组

其实就是定义空的接口,该接口的作用只作为分组标识来使用。

分组1:

代码语言:javascript复制
package cn.itechyou.validate;

/**
 * 分组1
 * @author Wangjn
 *
 */
public interface ValidateGroup1 {

}

分组2:

代码语言:javascript复制
package cn.itechyou.validate;

/**
 * 分组2
 * @author Wangjn
 *
 */
public interface ValidateGroup2 {

}

三、添加校验失败提示

user.name.notnull=姓名不能为空

user.age.size=年龄必须大于18周岁

user.address.notnull=地址不能为空

user.email.notnull=邮箱不能为空

四、新建实体

代码语言:javascript复制
package cn.itechyou.entity;

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

import cn.itechyou.validate.ValidateGroup1;
import cn.itechyou.validate.ValidateGroup2;

public class SysPersonInfo {
    @NotNull(message = "{user.name.notnull}",groups={ValidateGroup1.class})
    private String name;
    @Size(message = "{user.age.notnull}",groups={ValidateGroup1.class})
    private int age;
    @NotNull(message = "{user.address.notnull}",groups={ValidateGroup2.class})
    private String address;
    @Size(message = "{user.email.notnull}",groups={ValidateGroup2.class})
    private String email;

    //此处省略getter、setter

}

五、开发Controller

代码语言:javascript复制
package cn.itechyou.controller;

import java.util.List;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestMapping;

import cn.itechyou.entity.SysPersonInfo;
import cn.itechyou.validate.ValidateGroup1;
import cn.itechyou.validate.ValidateGroup2;

@Controller
@RequestMapping("/person")
public class PersonController {
    
    /**
     * 注册
     * @param model
     * @param person
     * @param result
     * @return
     */
    @RequestMapping("/reg")
    public String reg(Model model, @Validated(value = { ValidateGroup1.class }) SysPersonInfo person,
            BindingResult result) {
        if(result.hasErrors()) {
            List<ObjectError> allErrors = result.getAllErrors();
            for (ObjectError objectError : allErrors) {
                System.out.println(objectError.getDefaultMessage());
            }
            model.addAttribute("errors", allErrors);
            return "login";
        }
        return "success";
    }
    
    /**
     * 修改信息
     * @param model
     * @param person
     * @param result
     * @return
     */
    @RequestMapping("/modify")
    public String modify(Model model, @Validated(value = { ValidateGroup2.class }) SysPersonInfo person,
            BindingResult result) {
        if(result.hasErrors()) {
            List<ObjectError> allErrors = result.getAllErrors();
            for (ObjectError objectError : allErrors) {
                System.out.println(objectError.getDefaultMessage());
            }
            model.addAttribute("errors", allErrors);
            return "login";
        }
        return "success";
    }
}

上面Controller有两个方法,第一个是注册,我们只对name和age进行校验,第二个方法是修改信息,我们只对address和email进行校验,这样就实现了分组校验的目的。是不是很简单?

0 人点赞