🏆本文收录于「滚雪球学SpringBoot」(全网一个名)专栏,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
📜 前言
哈咯哇,同学们!今天我又要来聊个哇塞的东西,相信在表单验证时大家都一定经历过"数据长度要求"这个场景吧?我们在开发中经常需要对输入的数据进行长度控制,比如用户名要在 5 到 20 个字符之间,手机号必须是 10 个数字,购物车最多能添加 10 件商品等。这里就不得不提一个非常实用的"小管家"------@Size
注解!
@Size
注解:不仅能帮我们设定数据的最小值和最大值,还能适用于不同的数据类型,从字符串到集合再到数组都可以。今天,我们就来细细讲讲这个"长度守护者"如何在项目中大显身手吧,我要把最好用最实用的都通通分享给大家,帮同学们少走点弯路。
📚 目录
- 🧐 什么是
@Size
?它到底能干什么? - 🎩
@Size
的基础用法详解 - ✍️ 不同场景中的
@Size
实战演示 - 🔄 与其他注解的"神仙组合"
- 🛠️ @Size 校验的幕后机制揭秘
- 💡 最佳实践与常见误区
- 📈 总结与心得
🧐 什么是 @Size
?它到底能干什么?
首先,我们先要了解个概念,什么是 @Size
?它到底能干什么?@Size
是 Java Bean Validation 提供的一个非常简单又实用的注解,专门用于控制数据的大小范围。它通过设定 min
和 max
参数,确保数据长度或元素数量在我们期望的范围之内。无论是限制字符串的字符数,还是控制集合中的元素数量,只需要一个@Size
注解,就能轻松搞定。
换句话说,@Size
就是帮助我们"把控数据的合适度",让输入的数据不会过于冗长或过于短小,使其符合业务需求。比如如下代码示例:

🎩 @Size
的基础用法详解
@Size
的用法非常灵活,主要依赖两个核心参数:
min
:指定数据的最小长度,默认值是0
。max
:指定数据的最大长度,默认值是Integer.MAX_VALUE
,也就是"超级长"。
只需要这两个参数,我们就可以精确控制数据的长度范围。@Size
适用于 字符串、集合、数组和 Map 类型的字段。
示例:基础用法
假设我们有一个用户注册表单,用户名和密码字段的长度需要满足特定的要求。可以通过 @Size
注解来设置:
java
@Data
@EqualsAndHashCode(callSuper = true)
@ApiModel("user对象")
@TableName(value = "user")
public class User {
@ApiModelProperty(value = "姓名", required = true)
@Size(min = 5, max = 20, message = "用户名长度必须在5到20个字符之间")
private String userName;
@ApiModelProperty(value = "姓名", required = true)
@Size(min = 8, max = 16, message = "密码长度必须在8到16个字符之间")
private String passWord;
}
在这个例子中,userName
字段的长度限制在 5 到 20 个字符之间,passWord
字段在 8 到 16 个字符之间。如果数据不符合要求,Spring 会返回我们设置的自定义错误提示信息。
这里我先给大家通过Postman调用接口【新增用户】操作进行演示一下:
示例1:触发userName输入值长度不在[5,20]区间内。

示例2:触发passWord输入值长度不在[8,16]区间内。

综上所述,后端接口请求若也是通过此注解进行长度校验,就不怕被非法分子中途抓包进行数据串改或污染数据啦。
✍️ 不同场景中的 @Size
实战演示
接下来,我们将 @Size
的实际应用扩展到各种场景,看看它在不同数据类型中的精彩表现!
场景1:字符串长度控制
字符串的长度限制是 @Size
的典型用例。比如,假设我们有一个 Product
类,用于商品名称的长度控制(3 到 30 个字符):
java
import javax.validation.constraints.Size;
public class Product {
@Size(min = 3, max = 30, message = "产品名称长度必须在3到30个字符之间")
private String productName;
// Getter 和 Setter
}
如果 productName
的长度不在 3 到 30 个字符之间,系统会抛出验证错误。
场景2:集合元素数量限制
@Size
对集合也同样适用!假如我们有一个购物车,限制商品数量不能超过 10 个:
java
import javax.validation.constraints.Size;
import java.util.List;
public class ShoppingCart {
@Size(max = 10, message = "购物车最多包含10件商品")
private List<String> items;
// Getter 和 Setter
}
在这个例子中,items
集合的元素数量不能超过 10 个,否则系统会返回验证失败的信息。
场景3:数组长度控制
假设我们在订单类中有一个数组,用于存储订单号。我们希望最多允许 5 个订单号,可以这样设置:
java
import javax.validation.constraints.Size;
public class Order {
@Size(max = 5, message = "订单编号列表最多包含5个编号")
private String[] orderIds;
// Getter 和 Setter
}
通过 @Size
注解,我们可以轻松控制 orderIds
数组的长度,让它最多包含 5 个元素。
场景4:Map 条目数量控制
@Size
甚至可以用于 Map
!比如我们有一个学生分数记录表,限制最多 20 个学生的分数记录:
java
import javax.validation.constraints.Size;
import java.util.Map;
public class ScoreCard {
@Size(max = 20, message = "最多只能记录20个学生的分数")
private Map<String, Integer> studentScores;
// Getter 和 Setter
}
在这个例子中,studentScores
Map 的条目数被限制在 20 个以内。
🔄 与其他注解的"神仙组合"
对于@Size
注解,它除了自身参数校验等强大功能之外,它还非常适合与其他校验注解组合使用,尤其是在需要更复杂的验证逻辑时。比如,我们可以结合 @NotBlank
和 @NotBlank
,确保数据不仅符合大小限制,还具有实际内容进行空串判断。
示例:组合使用 @Size
和 @NotBlank
假如我们有一个 User
类,要求用户名长度在 5 到 20 之间,且不能为空白内容。那我们可以这样组合使用,示例如下:
java
@Data
@EqualsAndHashCode(callSuper = true)
@ApiModel("user对象")
@TableName(value = "user")
public class User extends BaseEntity {
private static final long serialVersionUID = 1L;
@NotBlank(message = "用户名不能为空")
@Size(min = 5, max = 20, message = "用户名长度必须在5到20个字符之间")
private String userName;
@NotBlank(message = "密码不能为空")
@Size(min = 8, max = 16, message = "密码长度必须在8到16个字符之间")
private String passWord;
// Getter 和 Setter
}
通过 @NotBlank
和 @Size
注解组合使用,既确保了长度合适,也避免了用户提交的内容为空白字符造成脏数据的问题,极大的为数据挖掘创造有利条件。
🛠️ @Size 注解原理剖析
@Size
注解,现在我们来聊聊它的实现原理。首先它的校验逻辑基于 Java Bean Validation API(JSR 380 规范)实现,通常由 Hibernate Validator 等库提供支持。简单来说,当数据传入系统时,框架会自动检测字段上的 @Size
注解,并检查长度或数量是否符合 min
和 max
的设置。
- 字符串类型 :
@Size
校验字符串的字符长度。 - 集合、数组、Map 类型:校验元素或条目的数量。
如果输入数据不符合设置的 min
和 max
范围,校验框架会自动抛出验证异常,向用户返回错误提示。这样一来,开发者可以放心地把长度控制交给 @Size
,不用再手写繁琐的校验逻辑。
1. @Size
注解的基本作用
其中,针对@Size
注解,它通常用于字符串、集合、数组等类型,目的是对它们的大小进行限制。常见的用法如下:
java
@Size(min = 5, max = 20, message = "用户名长度必须在5到20个字符之间")
private String userName;
在这个例子中,userName
字段的长度必须在5到10之间。如果长度不符合要求,将会抛出验证错误信息。
2. @Size
注解的源码解析
@Size
注解是一个元注解(Meta-annotation),它本身并不直接执行验证,而是通过与验证框架的集成来实现。它在 javax.validation.constraints
包下,并且属于 Constraint
类型的注解。
@Size
的源码大致如下:
java
package javax.validation.constraints;
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
// 定义该注解是一个约束注解
@Constraint(validatedBy = SizeValidator.class)
@Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE })
@Retention(RetentionPolicy.RUNTIME)
public @interface Size {
// 最小长度
int min() default 0;
// 最大长度
int max() default Integer.MAX_VALUE;
// 验证失败时的错误消息
String message() default "{javax.validation.constraints.Size.message}";
// 约束分组
Class<?>[] groups() default {};
// 额外的负载信息
Class<? extends Payload>[] payload() default {};
}
核心元素解析:
@Constraint(validatedBy = SizeValidator.class)
:这行指定了该注解使用哪个验证器来执行实际的验证逻辑,SizeValidator
类负责实现具体的验证。min()
和max()
:这两个属性分别定义了验证时的最小和最大长度。message()
:这个属性指定了验证失败时显示的错误消息。groups()
和payload()
:这两个属性通常用于更高级的场景,主要用于分组校验和传递额外的信息。

3. SizeValidator
验证器解析
@Size
注解的验证器是 SizeValidator
,它实现了 ConstraintValidator
接口。我们来看看 SizeValidator
的实现原理:
java
package javax.validation.constraints;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
public class SizeValidator implements ConstraintValidator<Size, CharSequence> {
private int min;
private int max;
// 初始化方法,用来读取注解中的配置参数
public void initialize(Size constraintAnnotation) {
this.min = constraintAnnotation.min();
this.max = constraintAnnotation.max();
}
// 验证逻辑
public boolean isValid(CharSequence value, ConstraintValidatorContext context) {
if (value == null) {
return true; // 如果为null,通常交给@NotNull来处理
}
int length = value.length();
return length >= min && length <= max;
}
}
SizeValidator
解析:
initialize(Size constraintAnnotation)
:该方法用于初始化验证器,读取@Size
注解中的min
和max
值。isValid(CharSequence value, ConstraintValidatorContext context)
:这是验证的核心方法,判断给定的value
是否符合min
和max
的限制。如果值为null
,返回true
,这通常意味着@Size
注解并不负责验证null
,而是交给其他注解(如@NotNull
)来处理。

💡 最佳实践与常见误区
1. 合理设置 min
和 max
的值
在使用 @Size
时,确保 min
和 max
的值与业务需求一致。特别注意避免将 min
和 max
设置为不合理的范围,比如 min = 10
而 max = 5
这样的配置会直接导致校验失败。
2. 为每个字段设置清晰的错误提示
@Size
的 message
属性可以自定义错误信息。确保提示信息简明清晰,便于用户理解。例如,指定"密码长度必须在8到16个字符之间"这样的错误提示信息。
3. 避免误用 @Size
@Size
适用于字符序列、集合、数组、Map 等具有长度或数量概念的数据类型,不适用于基本数据类型。如果需要控制数值范围,可以使用 @Min
和 @Max
等注解。
4. 灵活组合多种注解
@Size
通常与 @NotNull
、@NotBlank
等注解组合使用。特别是在需要既保证非空又要控制长度的场景,通过注解组合可以实现更精细的校验。
📈 总结与心得
@Size
注解,它是一个小巧却功能强大的数据验证工具,帮助我们在项目中轻松控制数据的长度和数量。无论是对字符串的字符数、集合的元素数量,还是 Map 的条目数,都能通过简单的 @Size
配置来实现。这样一来,开发者不需要手写繁琐的判断逻辑,就能实现高效的数据校验。
合理运用 @Size
注解,不仅让代码更简洁,还能大幅度减少用户输入不符合业务规则的情况,让数据验证变得既简单又稳固!希望通过这篇文章,你对 @Size
注解的使用有了更深入的理解,快在你的项目中用它提高数据质量吧!
📣 关于我
我是bug菌,CSDN | 掘金 | InfoQ | 51CTO | 华为云 | 阿里云 | 腾讯云 等社区博客专家,C站博客之星Top30,华为云多年度十佳博主&最具价值贡献奖,掘金多年度人气作者Top40,掘金等各大社区平台签约作者,51CTO年度博主Top12,掘金/InfoQ/51CTO等社区优质创作者;全网粉丝合计 30w+ ;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试真题、4000G PDF电子书籍、简历模板等海量资料,你想要的我都有,关键是你不来拿。
-End-