尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

@Size、@Max、@Min、@Length、注解的含义和区别

@Size、@Max、@Min、@Length、注解的含义和区别 前言在 Java 开发中尤其是在 Spring Boot 等框架中进行数据校验时我们经常会用到Min、Max、Size和Length这几个注解。它们功能相似但来源、适用对象和细节上存在差异。本文将详细解析这四个注解帮助你准确选择和使用。一、注解功能概述下表快速对比了四个注解的核心功能注解功能描述适用对象类型所属规范/依赖Min验证数值或字符串表示的数值是否大于或等于指定的最小值。Number, String (可转换为数字)JSR 380 (Bean Validation 2.0)Max验证数值或字符串表示的数值是否小于或等于指定的最大值。Number, String (可转换为数字)JSR 380 (Bean Validation 2.0)Size验证对象数组、集合、Map、字符串的长度/大小是否在给定的最小值和最大值范围内。Array, Collection, Map, StringJSR 380 (Bean Validation 2.0)Length验证字符串的长度是否在给定的最小值和最大值范围内。StringHibernate Validator 扩展二、注解详解与代码示例1. Min 与 Max来源属于 Java Bean Validation API (JSR 380) 标准注解。Maven 依赖dependency groupIdjavax.validation/groupId artifactIdvalidation-api/artifactId version2.0.2/version /dependency功能用于验证数值的大小。Min(value): 校验值必须 ≥value。Max(value): 校验值必须 ≤value。适用对象任何Number类型Integer,Long,BigDecimal等。String类型框架会尝试将其转换为数字进行校验。示例public class OrderRequest { Min(1) // 数量至少为1 private Integer quantity; Max(100.00) // 单价不能超过100 private BigDecimal unitPrice; Min(0) // 字符串“0”也会被转换为数字0进行校验 private String discountCode; // 假设存的是数字字符串 }2. Size来源同样属于 Java Bean Validation API (JSR 380) 标准注解。依赖同上使用validation-api。功能用于验证各种对象的长度或大小。适用对象String: 字符长度。Collection(List, Set): 元素个数。Array: 数组长度。Map: 键值对个数。示例public class UserProfile { Size(min 2, max 50) // 用户名长度2-50字符 private String username; Size(min 1, max 10) // 爱好列表至少1项最多10项 private ListString hobbies; Size(max 1024) // 文件字节数组最大1KB private byte[] avatar; }3. Length来源是Hibernate Validator提供的扩展注解非 JSR 标准。Maven 依赖需要引入 Hibernate Validator 实现。dependency groupIdorg.hibernate.validator/groupId artifactIdhibernate-validator/artifactId version6.0.18.Final/version /dependency功能专门用于验证字符串的长度。功能上与Size应用于字符串时几乎完全一致。适用对象仅限String类型。示例public class Product { Length(min 5, max 100) // 产品名称长度5-100字符 private String name; Length(max 500) // 描述最多500字符 private String description; }三、核心区别与如何选择1. 功能范畴不同Min/Max: 校验数值大小。关心的是“这个数够不够大/小”。Size/Length: 校验长度/大小。关心的是“这个集合/字符串有多长”。简单记忆max和min管数字大小length和size管长度。2. 来源与适用性不同Min, Max, Size: 是Java 标准 (JSR 380)的一部分通用性更强推荐在需要跨实现非Hibernate时使用。Length: 是Hibernate Validator 的扩展。如果你的项目已经强依赖 Hibernate Validator并且只校验字符串长度使用它语义更明确。但如果你希望代码不绑定特定供应商应优先使用Size。3. 适用对象范围不同Size功能最广可用于字符串、集合、数组、Map。Length功能最窄仅用于字符串。对于仅校验字符串长度的场景Size和Length可以互换但Size是标准选择。四、总结与最佳实践校验数值大小如年龄、价格、数量使用Min和Max。校验长度/大小如用户名、列表项数、文件大小优先使用标准注解Size因为它支持的类型最多且是JSR标准。如果项目明确使用 Hibernate Validator且你非常确定只校验字符串长度可以使用Length使意图更清晰。依赖选择Spring Boot 项目通常已自动引入spring-boot-starter-validation它包含了 Hibernate Validator 实现因此Min,Max,Size,Length都可以直接使用。但在定义公共库或需要避免供应商锁定时建议坚持使用Min,Max,Size这三个标准注解。五、实战综合示例下面通过一个 Spring Boot 中的用户注册请求示例展示如何综合运用Min、Max、Size、Length注解并配合Valid进行校验。1. 请求对象定义首先定义一个用户注册请求的 DTOData Transfer Object类UserRegisterRequestimport javax.validation.constraints.*; import java.util.List; public class UserRegisterRequest { // 使用 Size 校验用户名长度标准注解通用性强 Size(min 3, max 20, message 用户名长度必须在3到20个字符之间) private String username; // 使用 Length 校验密码长度Hibernate扩展语义更明确 Length(min 8, max 30, message 密码长度必须在8到30个字符之间) private String password; // 使用 Min 和 Max 校验年龄数值范围 Min(value 18, message 年龄必须大于或等于18岁) Max(value 120, message 年龄必须小于或等于120岁) private Integer age; // 使用 Size 校验爱好列表的元素个数 Size(min 1, max 5, message 爱好至少选择1项最多选择5项) private ListString hobbies; // 使用 Size 校验邮箱地址长度也可用Email此处演示Size Size(max 100, message 邮箱地址不能超过100个字符) Email(message 邮箱格式不正确) private String email; // 省略 getter 和 setter 方法 // 实际开发中请使用 Lombok Data 或手动生成 }2. Controller 层校验在 Spring Boot 的 Controller 中使用Valid注解触发对请求参数的自动校验import org.springframework.http.ResponseEntity; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.validation.Valid; RestController RequestMapping(/api/users) public class UserController { PostMapping(/register) public ResponseEntity? registerUser(RequestBody Valid UserRegisterRequest request) { // 只有当所有校验都通过时才会执行到这里 // 业务逻辑保存用户信息等... return ResponseEntity.ok(用户注册成功); } }3. 全局异常处理与校验失败响应当校验失败时Spring Boot 会抛出MethodArgumentNotValidException。我们可以通过全局异常处理器来捕获并返回结构化的错误信息。import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.validation.FieldError; import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; import java.util.HashMap; import java.util.Map; RestControllerAdvice public class GlobalExceptionHandler { ExceptionHandler(MethodArgumentNotValidException.class) public ResponseEntityMapString, Object handleValidationExceptions( MethodArgumentNotValidException ex) { MapString, Object errors new HashMap(); MapString, String fieldErrors new HashMap(); // 收集所有字段级别的错误信息 for (FieldError error : ex.getBindingResult().getFieldErrors()) { fieldErrors.put(error.getField(), error.getDefaultMessage()); } errors.put(timestamp, System.currentTimeMillis()); errors.put(status, HttpStatus.BAD_REQUEST.value()); errors.put(error, 参数校验失败); errors.put(message, 请求参数不符合要求); errors.put(fieldErrors, fieldErrors); return ResponseEntity.badRequest().body(errors); } }4. 校验失败响应示例假设客户端发送了以下不合法的 JSON 请求{ username: ab, // 长度小于3 password: 123, // 长度小于8 age: 16, // 小于18 hobbies: [], // 空列表元素个数为0 email: invalid-email // 格式不正确 }服务端将返回类似如下的错误响应{ timestamp: 1723548012345, status: 400, error: 参数校验失败, message: 请求参数不符合要求, fieldErrors: { username: 用户名长度必须在3到20个字符之间, password: 密码长度必须在8到30个字符之间, age: 年龄必须大于或等于18岁, hobbies: 爱好至少选择1项最多选择5项, email: 邮箱格式不正确 } }5. 示例要点总结注解混合使用在同一个 DTO 中可以根据字段的语义选择最合适的注解。例如对年龄使用Min/Max对列表使用Size对字符串长度既可以使用标准Size也可以使用 Hibernate 的Length。Valid 的作用在 Controller 方法的参数前添加Valid或Validated注解Spring 会自动触发 Bean Validation 校验。如果校验失败请求不会进入业务方法而是抛出异常。错误消息定制每个注解的message属性可以自定义校验失败时的提示信息提高 API 的可读性。全局异常处理通过RestControllerAdvice统一处理校验异常返回结构化的错误信息方便前端展示。依赖Spring Boot 项目只需引入spring-boot-starter-validation起步依赖即可使用所有标准注解JSR 380和 Hibernate Validator 扩展注解。通过这个完整的示例你可以看到如何在真实的 Spring Boot 项目中综合运用这些校验注解构建健壮、可维护的 API 参数校验层。
返回列表