首页 > 其他分享 >@NotNull和@NonNull的区别和使用

@NotNull和@NonNull的区别和使用

时间:2024-03-31 13:56:45浏览次数:25  
标签:NonNull 区别 元素 注释 必须 NotNull null 为空

区别
@NotNull在类字段中使用,表示该字段不能为空。它是 JSR303(Bean的校验框架)的注解。在调用controller的方法中加入@Valid就可以验证该方法参数中该类的对应属性是否为空,如果为空,注解中的提示信息会保存在result中。

@NonNull在方法或构造函数的参数上使用,表示该参数不能为空。

@NotNull使用

/**
 * user类
 */
@Data
public class User {

    private int id;
    @NotNull(message = "babyId不能为空")
    private String babyId;
}
/**
 * controller的方法
 * controller方法要加上@Valid ,表示需要验证!
 */
 @PostMapping("getMyUser")
 @ResponseBody
 public Baby getBaby(@Valid @RequestBody User user){
     return babyService.getBabyById(user.getBabyId());
 }

此时调用controller的getBaby方法时如果user中babyId为空,那么程序会报MethodArgumentNotValidException

获取错误信息

将上面的getBaby改为下面的例子:

@PostMapping("getMyUser")
@ResponseBody
public Baby getBaby(@Valid @RequestBody User user,Errors errors){
    List<ObjectError> oes = errors.getAllErrors();
    for (ObjectError oe : oes) {
        String key = null;
        String msg = null;
        // 字段错误
        if (oe instanceof FieldError) {
            FieldError fe = (FieldError) oe;
            key = fe.getField();// 获取错误验证字段名
        } else {
            // 非字段错误
            key = oe.getObjectName();// 获取验证对象名称
        }

        // 错误信息
        msg = oe.getDefaultMessage();
        System.out.println("key:"+key+";msg="+msg);
    }
    return babyService.getBabyById(user.getBabyId());
}

其他注解及解释
除了@NotNull,还有其他类似的注解,都是在类字段上使用

  • @Null 被注释的元素必须为null
  • @NotNull 被注释的元素不能为null,可以为空字符串
  • *@AssertTrue 被注释的元素必须为true
  • *@AssertFalse 被注释的元素必须为false
  • *@Min(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
  • *@Max(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
  • *@DecimalMin(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
  • *@DecimalMax(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
  • *@Size(max,min) 被注释的元素的大小必须在指定的范围内。
  • *@Digits(integer,fraction) 被注释的元素必须是一个数字,其值必须在可接受的范围内
  • *@Past 被注释的元素必须是一个过去的日期
  • *@Future 被注释的元素必须是一个将来的日期
  • *@Pattern(value) 被注释的元素必须符合指定的正则表达式。
  • *@Email 被注释的元素必须是电子邮件地址
  • *@Length 被注释的字符串的大小必须在指定的范围内
  • *@Range 被注释的元素必须在合适的范围内
  • *@NotEmpty:用在集合类上,不能为null,并且长度必须大于0
  • *@NotBlank:只能作用在String上,不能为null,而且调用trim()后,长度必须大于0

@NonNull使用

@Override
@Transactional
public Baby getBabyById(@NonNull String babyId) {
    return babyMapper.getBabyById(babyId);
}

————————————————

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/DingKG/article/details/103455157

标签:NonNull,区别,元素,注释,必须,NotNull,null,为空
From: https://www.cnblogs.com/isme-zjh/p/18106665

相关文章

  • 普通函数与箭头函数的区别
    概述我们在学习js的时候经常会跟函数打交道,其中普通函数和箭头函数是用的比较多的2种,很多同学并不清楚二者的区别,这里我们花一些时间讨论一下。作用域在讨论箭头函数与普通函数的区别之前,我们需要先讨论一下作用域的概念。作用域分为:全局作用域,局部作用域,块级作用域全局作用......
  • Web墨卡托投影介绍,Web墨卡托投影和普通墨卡托投影有什么区别?EPSG:3857坐标系和EPSG:43
    Web墨卡托投影和普通墨卡托投影在本质上是相同的,但它们在坐标范围使用单位和应用领域上存在一些区别:坐标范围:普通墨卡托投影的坐标范围通常在整个地球表面上,由于使用浮点数表示,所以不限制其范围。Web墨卡托投影的坐标范围通常被限制在一个固定的范围内,以适应Web地图的显......
  • CTF中各类加密密文区别
    收集CTF-MISC中常见的密码种类base16字典中包含0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、Fbase32打印字符大写字母(A-Z)和数字234567base36使用0–9和拉丁字母A–Z表示数字。base58数字、大写字母、小写字母,去除歧义字符0(零)、O(大写字母O)、I(大写字母i)、l......
  • 描述C语言中的进程和线程之间的区别
    描述C语言中的进程和线程之间的区别在C语言中,进程和线程是两个非常重要的概念,它们在操作系统中各自扮演着独特的角色。理解它们之间的区别对于编写高效、可维护的并发程序至关重要。下面将详细阐述进程和线程在C语言中的区别。首先,我们来探讨进程的概念。进程是操作系统分配......
  • I2C Block读写和SMBus Block读写区别
    资料来源:韦东山第三期 SMBusBlock读:对应i2c-tools中的函数:i2c_smbus_read_block_data() SMBusBlock写:对应i2c-tools中的函数:i2c_smbus_write_block_data() I2CBlock读:对应i2c-tools中的函数:i2c_smbus_read_i2c_block_data() I2CBlock写:对应i2c-tools中的......
  • 数据资产与数字资产的区别
    一、数据资产和数字资产的区别1.定义和本质数据资产是指企业或组织在业务运营过程中产生和积累的各种数据资源,包括结构化数据(如数据库中的交易记录)和非结构化数据(如文档、图像、视频等)。这些数据资源如果能被恰当管理和利用,就能为企业创造价值,因此被视为一种资产......
  • 在Linux中,Linux内核和Shell有何区别?
    Linux内核和Shell是Linux操作系统中两个截然不同的组成部分,它们各自承担着不同的职责,有着明显的区别:Linux内核:定义:Linux内核是操作系统的核心组件,它是Linux系统的心脏,负责管理系统的硬件资源(如CPU、内存、磁盘、网络等)和提供基本的服务,为运行在其上的应用程序提供一个抽象、统......
  • 临时重定向(302)和永久重定向(301)区别
    临时重定向和永久重定向之间的主要区别体现在重定向的持久性、搜索引擎处理和缓存行为上。持久性:永久重定向(通常是HTTP状态码301)表明资源已经永久性地移动到了新的位置。这意味着,一旦设置了永久重定向,所有后续对原始URL的请求都应该被自动转发到新的URL,而且这个重定向是长期......
  • 实时渲染什么意思?实时渲染和离线渲染的本质区别
    一、实时渲染是什么意思?实时渲染是指在计算机程序运行时即时地生成图像和动画的过程,这种渲染技术通常用于网络游戏、虚拟现实和增强现实等需要实时交互的XR应用中。实时渲染需要在每秒内渲染数百万到数十亿个像素,以呈现出平滑的动画和交互性能,它包括了一系列的计算和处理步骤,如几......
  • 拦截器和过滤器的区别
            在平常使用中,对于某些功能的实现,可能既可以用拦截器完成,又可以用监听器完成。这样使我们对于这两个概念有一定程度上的混淆。 拦截器和过滤器的区别过滤器和拦截器的区别:①拦截器是基于java的反射机制的,而过滤器是基于函数回调。②拦截器不依赖与serv......