当前位置: 首页 > news >正文

【Spring】@Size 无法拦截null的原因

问题复现

  • 在构建 Web 服务时,我们一般都会对一个 HTTP 请求的 Body 内容进行校验,例如我们来看这样一个案例及对应代码。
  • 当开发一个学籍管理系统时,我们会提供了一个 API 接口去添加学生的相关信息,其对象定义参考下面的代码:
    import lombok.Data;
    import javax.validation.constraints.Size;
    @Data
    public class Student {@Size(min = 1, max = 10)private String name;private short age;
    }
    
  • 如上代码所示,我们想针对学生的姓名进行一个判断,不能为空,并且长度为1-10。
  • 然后,我们以下面的 JSON Body 做测试:
    {"name": "","age": 10,"phone": {"number":"12306"}
    }
    
  • 测试结果符合我们的预期,但是假设更进一步,用下面的 JSON Body(去除 name 字段)做测试呢?
    {"age": 10,"phone": {"number":"12306"}
    }
    
  • 我们会发现校验失败了。这结果难免让我们有一些惊讶,也倍感困惑:@Size(min = 1, max = 10) 都已经要求最小长度为 1 了,难道还只能约束空字符串(即“”),不能约束 null?

案例分析

  • 如果我们稍微留心点的话,就会发现其实 @Size 的 Javadoc 已经明确了这种情况,参考下图:
    在这里插入图片描述
  • 如图所示,“null elements are considered valid” 很好地解释了约束不住 null 的原因。当然纸上得来终觉浅,我们还需要从源码级别解读下 @Size 的校验过程。
  • 这里我们找到了完成 @Size 约束的执行方法,参考 SizeValidatorForCharSequence#isValid 方法:
    public boolean isValid(CharSequence charSequence, ConstraintValidatorContext constraintValidatorContext) {if ( charSequence == null ) {return true;}int length = charSequence.length();return length >= min && length <= max;
    }
    
  • 如代码所示,当字符串为 null 时,直接通过了校验,而不会做任何进一步的约束检查。

问题修正

  • 关于这个问题的修正,其实很简单,我们可以使用其他的注解(@NotNull 或 @NotEmpty)来加强约束,修正代码如下:
    @NotEmpty
    @Size(min = 1, max = 10)
    private String name;
    
  • 完成代码修改后,重新测试,你就会发现约束已经完全满足我们的需求了。
http://www.lryc.cn/news/519906.html

相关文章:

  • 【Block总结】掩码窗口自注意力 (M-WSA)
  • 用 HTML5 Canvas 和 JavaScript 实现雪花飘落特效
  • 【cocos creator】【ts】事件派发系统
  • 《探索鸿蒙Next上开发人工智能游戏应用的技术难点》
  • CSS | CSS实现两栏布局(左边定宽 右边自适应,左右成比自适应)
  • acwing_3195_有趣的数
  • Liunx-搭建安装VSOMEIP环境教程 执行 运行VSOMEIP示例demo
  • Git | git revert命令详解
  • ASP.NET Core 中,Cookie 认证在集群环境下的应用
  • Flyte工作流平台调研(五)——扩展集成
  • 【AUTOSAR 基础软件】软件组件的建立与使用(“代理”SWC)
  • java通过ocr实现识别pdf中的文字
  • Git 命令代码管理详解
  • Docker的安装和使用
  • Flink系统知识讲解之:Flink内存管理详解
  • 使用JMeter模拟多IP发送请求!
  • 【Ubuntu与Linux操作系统:六、软件包管理】
  • 【数据结构-堆】力扣1834. 单线程 CPU
  • 【前端动效】原生js实现拖拽排课效果
  • C#使用OpenTK绘制3D可拖动旋转图形三棱锥
  • 排序的本质、数据类型及算法选择
  • Python的列表基础知识点(超详细流程)
  • HarmonyOS鸿蒙开发 弹窗及加载中指示器HUD功能实现
  • 【Ubuntu与Linux操作系统:一、Ubuntu安装与基本使用】
  • React 元素渲染
  • 【2024年华为OD机试】 (C卷,100分)- 括号匹配(Java JS PythonC/C++)
  • 解锁企业数字化转型新力量:OpenCoze(开源扣子)
  • 【网络云SRE运维开发】2025第2周-每日【2025/01/12】小测-【第12章 rip路由协议】理论和实操考试题解析
  • 【微服务】8、分布式事务 ( XA 和 AT )
  • CVE-2025-22777 (CVSS 9.8):WordPress | GiveWP 插件的严重漏洞