想确保用户输入有效吗?@Size注解是你的不二之选!

🏆本文收录于「滚雪球学SpringBoot」(全网一个名)专栏,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!

📜 前言

哈咯哇,同学们!今天我又要来聊个哇塞的东西,相信在表单验证时大家都一定经历过"数据长度要求"这个场景吧?我们在开发中经常需要对输入的数据进行长度控制,比如用户名要在 5 到 20 个字符之间,手机号必须是 10 个数字,购物车最多能添加 10 件商品等。这里就不得不提一个非常实用的"小管家"------@Size 注解!

@Size 注解:不仅能帮我们设定数据的最小值和最大值,还能适用于不同的数据类型,从字符串到集合再到数组都可以。今天,我们就来细细讲讲这个"长度守护者"如何在项目中大显身手吧,我要把最好用最实用的都通通分享给大家,帮同学们少走点弯路。

📚 目录

  1. 🧐 什么是 @Size?它到底能干什么?
  2. 🎩 @Size 的基础用法详解
  3. ✍️ 不同场景中的 @Size 实战演示
  4. 🔄 与其他注解的"神仙组合"
  5. 🛠️ @Size 校验的幕后机制揭秘
  6. 💡 最佳实践与常见误区
  7. 📈 总结与心得

🧐 什么是 @Size?它到底能干什么?

首先,我们先要了解个概念,什么是 @Size?它到底能干什么?@Size 是 Java Bean Validation 提供的一个非常简单又实用的注解,专门用于控制数据的大小范围。它通过设定 minmax 参数,确保数据长度或元素数量在我们期望的范围之内。无论是限制字符串的字符数,还是控制集合中的元素数量,只需要一个@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 注解,并检查长度或数量是否符合 minmax 的设置。

  • 字符串类型@Size 校验字符串的字符长度。
  • 集合、数组、Map 类型:校验元素或条目的数量。

如果输入数据不符合设置的 minmax 范围,校验框架会自动抛出验证异常,向用户返回错误提示。这样一来,开发者可以放心地把长度控制交给 @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 注解中的 minmax 值。
  • isValid(CharSequence value, ConstraintValidatorContext context) :这是验证的核心方法,判断给定的 value 是否符合 minmax 的限制。如果值为 null,返回 true,这通常意味着 @Size 注解并不负责验证 null,而是交给其他注解(如 @NotNull)来处理。

💡 最佳实践与常见误区

1. 合理设置 minmax 的值

在使用 @Size 时,确保 minmax 的值与业务需求一致。特别注意避免将 minmax 设置为不合理的范围,比如 min = 10max = 5 这样的配置会直接导致校验失败。

2. 为每个字段设置清晰的错误提示

@Sizemessage 属性可以自定义错误信息。确保提示信息简明清晰,便于用户理解。例如,指定"密码长度必须在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-

相关推荐
你是狒狒吗5 分钟前
HttpServletRequest是什么
java
你们补药再卷啦18 分钟前
springboot 项目 jmeter简单测试流程
java·spring boot·后端
网安密谈28 分钟前
SM算法核心技术解析与工程实践指南
后端
菜鸡且互啄6929 分钟前
sql 向Java的映射
java·开发语言
bobz96532 分钟前
Keepalived 检查和通知脚本
后端
AKAMAI34 分钟前
教程:在Linode平台上用TrueNAS搭建大规模存储系统
后端·云原生·云计算
盘盘宝藏35 分钟前
idea搭建Python环境
后端·intellij idea
喵手39 分钟前
Spring Boot 项目基于责任链模式实现复杂接口的解耦和动态编排!
spring boot·后端·责任链模式
顾林海39 分钟前
深度解析HashMap工作原理
android·java·面试
大鹏dapeng1 小时前
使用gone v2 的 Provider 机制升级改造 goner/xorm 的过程记录
后端·设计模式·go