首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >SpringBoot--数据校验(普通校验、分组校验)

SpringBoot--数据校验(普通校验、分组校验)

作者头像
JAVA葵花宝典
发布于 2020-03-06 16:41:34
发布于 2020-03-06 16:41:34
2.6K0
举报
文章被收录于专栏:JAVA葵花宝典JAVA葵花宝典

作者:吴声子夜歌

原文链接:https://blog.csdn.net/cold___play/article/details/104209719

普通校验

普通检验是基础用法,非常容易,首先需要用户在SpringBootWeb项目中添加数据校验相关的依赖:

代码语言:javascript
复制
    <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
        </dependency>

查看LocalValidatorFactoryBean类的源码,发现默认的ValidationMessageSource(校验出错时的提示文件) 是resources目录下的ValidationMessages.properties 文件,因此在resources目录下创建ValidationMessages.properties文件,内容如下:

代码语言:javascript
复制
user.name.size=用户名长度介于5到10个字符之间
user.address.notnull=用户地址不能为空
user.age.size=年龄输入不正确
user.email.notnull=邮箱不能为空
user.email.pattern=邮箱格式不正确

创建User类,配置数据校验:

代码语言:javascript
复制
public class User {

    private Integer id;

    @Size(min = 5, max = 10, message = "{user.name.size}")
    private String name;

    @NotNull(message = "{user.address.notnull}")
    private String address;

    @DecimalMin(value = "1", message = "{user.age.size}")
    @DecimalMax(value = "200", message = "{user.age.size}")
    private Integer age;

    @Email(message = "{user.email.pattern}")
    @NotNull(message = "{user.email.notnull}")
    private String email;

    //省略getter和setter
}
  • @Size表示一个字符串的长度或者一个集合的大小,必须在某一个范围中;min参数表示范围的下限;max参数表示范围的上限;message表示校验失败时的提示信息。
  • @NotNull注解表示该字段不能为空
  • @DecimalMin注解表示对应属性值的下限
  • @DecimalMax注解表示对应属性值的上限
  • @Email注解表示对应属性格式是一个Email

创建UserController:

代码语言:javascript
复制
@RestController
public class UserController {

    @PostMapping("/user")
    public List<String> addUser(@Validated User user, BindingResult result){
        List<String> errors = new ArrayList<>();
        if(result.hasErrors()){
            List<ObjectError> allErrors = result.getAllErrors();
            for(ObjectError error : allErrors){
                errors.add(error.getDefaultMessage());
            }
        }
        return errors;
    }
}
  • 给User参数添加@Validated注解,表示需要对该参数做校验,紧接着的BindingResult参数表示在校验出错时保存的出错信息。
  • 如果BindingResult中的haiErrors方法返回true,表示有错误信息,此时遍历错误信息,将之返回给前端

使用Postman测试:

直接访问"/user"接口:

传入用户地址、一个非法邮箱地址以及一个格式不正确的用户名:

分组校验

有的时候,开发者在某一个实体类中定义了很多校验规则,但是在某一次业务处理中,并不需要这么多校验规则,此时就可以使用分组校验:

首先创建两个分组接口:

代码语言:javascript
复制
public interface ValidationGroup1 {
}
public interface ValidationGroup2 {
}

在实体类中添加分组信息:

代码语言:javascript
复制
public class User {

    private Integer id;

  //groups属性,表示该校验属性规则所属的分组

    @Size(min = 5, max = 10, message = "{user.name.size}", groups = ValidationGroup1.class)
    private String name;

    @NotNull(message = "{user.address.notnull}", groups = ValidationGroup2.class)
    private String address;

    @DecimalMin(value = "1", message = "{user.age.size}")
    @DecimalMax(value = "200", message = "{user.age.size}")
    private Integer age;

    @Email(message = "{user.email.pattern}")
    @NotNull(message = "{user.email.notnull}", groups = {ValidationGroup1.class, ValidationGroup2.class})
    private String email;
}

在@Validated注解中指定校验分组:

代码语言:javascript
复制
@RestController
public class UserController {


    //@Validated(ValidationGroup2.class) 表示这里的校验使用ValidationGroup2分组的校验规则,即只校验邮箱地址是否为空、用户地址是否为空
    @PostMapping("/user")
    public List<String> addUser(@Validated(ValidationGroup2.class) User user, BindingResult result){
        List<String> errors = new ArrayList<>();
        if(result.hasErrors()){
            List<ObjectError> allErrors = result.getAllErrors();
            for(ObjectError error : allErrors){
                errors.add(error.getDefaultMessage());
            }
        }
        return errors;
    }
}

测试:

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-03-06,如有侵权请联系 cloudcommunity@tencent.com 删除
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档