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

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

 

一、什么是分组校验

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

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

 

二、定义分组

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

 

分组1:

package cn.itechyou.validate;

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

}

 

分组2:

package cn.itechyou.validate;

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

}

 

三、添加校验失败提示

 

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

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

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

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

 

四、新建实体

 

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

 

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进行校验,这样就实现了分组校验的目的。是不是很简单?

人已赞赏
随笔日记

关于毕业后找工作的问题

2020-11-9 3:57:00

随笔日记

设计模式之欢迎来到设计模式世界(二),设计模式之欢迎来到设计模式世界(一)

2020-11-9 3:57:02

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索