spring boot参数验证注解@NotNull、@NotBlank和@NotEmpty区别

目录

前言

使用spring boot参数验证是常常会使用@NotNull、@NotBlank和@NotEmpty三个判断是否不为空的注解,中文都有不能为空的意思,大部分使用者都傻傻分清它们之间到底有什么区别。今天就让咱们来一起探索它们之间的不同吧。

说明

注解名称 功能
@NotNull 可用于所有类型的字段,判断字段不能为null
@NotBlank 只能用于String类型的字段,判断字段不能为空串或空白(空格或制表符)字符串
@NotEmpty 可用于String类型和集合类型,用在String字段上时,字段不能为空串;用于集合时,集合不能为null或集合的size不为0

共同点:三个注解标注的字段都不能为null

举例

实体User.java

java 复制代码
import lombok.Data;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.List;

/**
 * @Description TODO
 * @Author liqinglong
 * @DateTime 2024-04-30 11:02
 * @Version 1.0
 */
@Data
public class User {
    @NotBlank(message = "姓名不为空")
    private String userName;
    @NotNull(message = "年龄不能为空")
    private Integer age;
    @NotEmpty(message = "权限列表不能空")
    private List<String> rolerList;
}

测试类 ValidTest.java

java 复制代码
import com.ruoyi.common.exception.ServiceException;
import org.apache.commons.collections.CollectionUtils;

import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

/**
 * @Description TODO
 * @Author liqinglong
 * @DateTime 2024-04-30 11:07
 * @Version 1.0
 */
public class ValidTest {
    public static void main(String[] args) {
        // Bean 验证器
        ValidatorFactory vf = Validation.buildDefaultValidatorFactory();
        Validator validator = vf.getValidator();
        User user = new User();
        //姓名为空格或制表符
        user.setUserName("                      ");
        //年龄为null
        user.setAge(null);
        //权限集合的长度为0
        List<String> roles = new ArrayList<>();
        user.setRolerList(roles);
        // 校验的业务对象:user,Bean 类型:User
        Set<ConstraintViolation<User>> checkSet = validator.validate(user);
        if (CollectionUtils.isNotEmpty(checkSet)) {
            // Bean验证不通过
            throw new ServiceException(checkSet.stream().map(ConstraintViolation::getMessage).collect(Collectors.joining(",")));
        }
    }
}

运行结果:

其它各种情况,请同学自行测试,测试得出的结论欢迎到评论区留言。

相关推荐
覆东流8 小时前
7.Java数组
java·开发语言·后端
threerocks9 小时前
AI 原生软件开发生命周期手册 - 如何借助 AI,逐阶段改造软件开发生命周期
前端·javascript·后端
JavaPub-rodert9 小时前
王仕宇在 Go Context 如何解决协程泄漏与超时控制
开发语言·后端·golang·iphone·javapub·王仕宇
深漂的华哥10 小时前
Ruoyi-Plus前后端分离场景下,数据加密传输
java·spring boot·后端·开源·maven·ruoyi
why技术11 小时前
eli5,我觉得这个全网在吹的技能,使用体验真的很一般啊。
前端·人工智能·后端
学习星球11 小时前
Qwik 框架入门实战:从开源项目 Qwik City 开始,用可恢复性替代水合
后端·前端框架·开源·c5全栈
剑胆琴心静水深流11 小时前
全栈之路6---web集成与呈现
前端·vue.js·spring boot·分布式·spring·前端框架·npm
IT_陈寒13 小时前
被Java的final坑惨了,这些细节你可能也忽略了
前端·人工智能·后端
Zadig13 小时前
企业 Agent 总烂在 Demo 里?Zadig 工作流 AI 任务给了一条路
后端·devops
Zadig14 小时前
告别"人肉扛雷":Zadig 用 AI 接管发布前最脏最累的 15 分钟
后端·aiops