注解完整参考指南
本文档提供了 SpEL Validator 中所有内置注解的完整参考,包括启动注解和约束注解的详细说明。
注解总览
启动注解
| 注解 | 功能说明 | 使用位置 |
|---|---|---|
@SpelValid | 开启 SpEL 约束注解验证,激活校验器 | 类、字段、方法参数、构造函数参数 |
约束注解
| 注解 | 对标 jakarta.validation-api | 功能说明 |
|---|---|---|
@SpelAssert | @AssertTrue | 逻辑断言校验 |
@SpelNotNull | @NotNull | 非 null 校验 |
@SpelNull | @Null | 必须为 null 校验 |
@SpelNotEmpty | @NotEmpty | 集合、字符串、数组非空校验 |
@SpelNotBlank | @NotBlank | 字符串非空串校验 |
@SpelSize | @Size | 集合、字符串、数组长度校验 |
@SpelMin | @Min、@DecimalMin | 数值最小值校验 |
@SpelMax | @Max、@DecimalMax | 数值最大值校验 |
@SpelDigits | @Digits | 数字位数约束校验 |
@SpelFuture | @Future | 时间必须是未来时间 |
@SpelFutureOrPresent | @FutureOrPresent | 时间必须是未来或当前时间 |
@SpelPast | @Past | 时间必须是过去时间 |
@SpelPastOrPresent | @PastOrPresent | 时间必须是过去或当前时间 |
时间日期类型说明
时间日期类型包括:Date、Calendar、Instant、LocalDate、LocalDateTime、LocalTime、MonthDay、OffsetDateTime、OffsetTime、Year、YearMonth、 ZonedDateTime 以及各种 Chrono 类型。
公共属性(重要)
所有约束注解(除 @SpelValid 外)都包含以下三个通用属性:
condition:约束开启条件,支持 SpEL 表达式,表达式的计算结果必须为boolean类型。当计算结果为 true 时,才会对带注解的元素进行校验,默认情况下开启。message:校验失败时的提示信息,支持多语言 key,使用方式参考 国际化消息。group:分组条件,支持 SpEL 表达式,当分组条件满足时,才会对带注解的元素进行校验。具体使用方式参考 分组校验。
@SpelValid
功能说明:标记开启 SpEL 约束注解的验证,其功能类似于 @Valid,用于激活 SpEL 约束校验。
使用位置:类、字段、方法参数、构造函数参数
属性说明:
condition:开启校验的前置条件,值必须为合法的 SpEL 表达式,计算结果必须为boolean类型。当表达式为空或计算结果为 true 时,表示开启校验。spelGroups:分组功能,值必须为合法的 SpEL 表达式数组。当分组信息为空时,表示不开启分组校验。message:校验失败时的错误消息(通常不需要设置)groups:标准 Jakarta Validation 分组payload:标准 Jakarta Validation 载荷
使用示例:
// 基本用法
@Data
@SpelValid
public class UserVo {
@SpelNotNull
private String name;
}
// 条件开启
@Data
@SpelValid(condition = "#this.enableValidation == true")
public class ConditionalVo {
private Boolean enableValidation;
@SpelNotNull
private String content;
}
// 分组校验
@Data
@SpelValid(spelGroups = "#this.type")
public class GroupVo {
private String type; // "add" 或 "update"
@SpelNotNull(group = "'update'")
private Integer id;
@SpelNotNull(group = {"'add'", "'update'"})
private String name;
}@SpelAssert
功能说明:被标记的元素需要满足指定的断言条件,用于复杂的自定义校验逻辑。
支持类型:任何类型
特有属性:
assertTrue:断言语句,必须为合法的 SpEL 表达式,计算结果必须为boolean类型。true 为校验成功,false 为校验失败。默认值为"true"。
使用示例:
@Data
@SpelValid
public class AssertExampleVo {
// 枚举值校验
@SpelAssert(assertTrue = "T(cn.sticki.enums.StatusEnum).isValid(#this.status)",
message = "状态值不合法")
private Integer status;
// 复杂逻辑校验
@SpelAssert(assertTrue = "#this.startTime < #this.endTime",
message = "开始时间必须小于结束时间")
private Long startTime;
private Long endTime;
// 调用 Spring Bean 校验
@SpelAssert(assertTrue = "@userService.existsById(#this.userId)",
message = "用户不存在")
private Long userId;
}@SpelNotNull
功能说明:被标记的元素不能为 null。
支持类型:任何类型
使用示例:
@Data
@SpelValid
public class NotNullExampleVo {
private Boolean switchAudio;
// 条件校验:当 switchAudio 为 true 时才校验
@SpelNotNull(condition = "#this.switchAudio == true",
message = "语音内容不能为空")
private Object audioContent;
}@SpelNull
功能说明:被标记的元素必须为 null。
支持类型:任何类型
@SpelNotEmpty
功能说明:被标记的元素不能为 null 或空。
支持类型:
CharSequence(评估字符序列的长度)Collection(评估集合大小)Map(评估 Map 大小)- 数组(计算数组长度)
使用示例:
@Data
@SpelValid
public class NotEmptyExampleVo {
private String type;
@SpelNotEmpty(condition = "#this.type == 'list'",
message = "列表不能为空")
private List<String> items;
}@SpelNotBlank
功能说明:被标记的元素不能为 null、空字符串或只包含空白字符。
支持类型:CharSequence
@SpelSize
功能说明:被标记的元素大小必须在指定边界(包含)之间。null 元素被认为是有效的。
支持类型:
CharSequence(评估字符序列的长度)Collection(评估集合大小)Map(评估 Map 大小)- 数组(计算数组长度)
特有属性:
min:指定元素最小值,必须为合法的 SpEL 表达式,计算结果必须为数字类型。默认值为"0"。max:指定元素最大值,必须为合法的 SpEL 表达式,计算结果必须为数字类型。默认值为"T(Integer).MAX_VALUE"。
使用示例:
@Data
@SpelValid
public class SizeExampleVo {
// 字符串长度校验
@SpelSize(min = "2", max = "10", message = "用户名长度必须在2-10之间")
private String username;
// 动态大小校验
@SpelSize(min = "#this.minSize", max = "#this.maxSize")
private List<String> items;
private Integer minSize;
private Integer maxSize;
}@SpelMin
功能说明:被标记的元素值必须大于或等于指定的最小值。null 元素被认为是有效的。
支持类型:
- 所有
Number类型及它们的基本数据类型 - 使用
CharSequence表示的数字,支持科学计数法
特有属性:
value:指定元素最小值,必须为合法的 SpEL 表达式,计算结果必须为Number类型。(必填参数)inclusive:指定边界值是否被包含在内。当为true时,验证value >= min;当为false时,验证value > min。默认为true。
使用示例:
@Data
@SpelValid
public class MinExampleVo {
@SpelMin(value = "18", message = "年龄不能小于18岁")
private Integer age;
// 动态最小值
@SpelMin(value = "#this.minValue")
private Double score;
// 字符串数字校验
@SpelMin(value = "0", message = "金额不能为负数")
private String amount;
// 不包含边界值的校验
@SpelMin(value = "0", inclusive = false, message = "数量必须大于0")
private Integer quantity;
private Double minValue;
}@SpelMax
功能说明:被标记的元素值必须小于或等于指定的最大值。null 元素被认为是有效的。
支持类型:
- 所有
Number类型及它们的基本数据类型 - 使用
CharSequence表示的数字,支持科学计数法
特有属性:
value:指定元素最大值,必须为合法的 SpEL 表达式,计算结果必须为Number类型。(必填参数)inclusive:指定边界值是否被包含在内。当为true时,验证value <= max;当为false时,验证value < max。默认为true。
使用示例:
参考 @SpelMin。
@SpelDigits
功能说明:被标记的元素值必须是指定范围内的数字。null 元素被认为是有效的。
支持类型:
- 所有
Number类型及它们的基本数据类型 - 使用
CharSequence表示的数字,支持科学计数法
特有属性:
integer:整数部分的最大位数,必须为合法的 SpEL 表达式,计算结果必须为非负整数。(必填参数)fraction:小数部分的最大位数,必须为合法的 SpEL 表达式,计算结果必须为非负整数。(必填参数)
使用示例:
@Data
@SpelValid
public class DigitsExampleVo {
// 整数部分最多3位,小数部分最多2位
@SpelDigits(integer = "3", fraction = "2", message = "价格格式不正确,整数部分最多3位,小数部分最多2位")
private BigDecimal price;
// 字符串数字校验
@SpelDigits(integer = "6", fraction = "0", message = "用户ID必须是6位以内的整数")
private String userId;
// 动态位数限制
@SpelDigits(integer = "#this.maxIntegerDigits", fraction = "#this.maxFractionDigits")
private Double amount;
private Integer maxIntegerDigits;
private Integer maxFractionDigits;
// 只允许整数(小数部分为0位)
@SpelDigits(integer = "10", fraction = "0", message = "必须是整数")
private Long count;
}@SpelFuture
功能说明:被标记的元素必须是一个将来的时间。null 元素被认为是有效的。
支持类型:
Date、CalendarInstant、LocalDate、LocalDateTime、LocalTimeMonthDay、OffsetDateTime、OffsetTimeYear、YearMonth、ZonedDateTimeHijrahDate、JapaneseDate、MinguoDate、ThaiBuddhistDate
@SpelFutureOrPresent
功能说明:被标记的元素必须是一个将来或现在的时间。null 元素被认为是有效的。
支持类型:与 @SpelFuture 相同
@SpelPast
功能说明:被标记的元素必须是一个过去的时间。null 元素被认为是有效的。
支持类型:与 @SpelFuture 相同
@SpelPastOrPresent
功能说明:被标记的元素必须是一个过去或现在的时间。null 元素被认为是有效的。
支持类型:与 @SpelFuture 相同
时间校验使用示例:
@Data
@SpelValid
public class TimeExampleVo {
@SpelPast(message = "出生日期必须是过去时间")
private LocalDate birthDate;
@SpelFutureOrPresent(message = "预约时间不能是过去时间")
private LocalDateTime appointmentTime;
// 条件时间校验
@SpelFuture(condition = "#this.needFutureCheck == true",
message = "该时间必须是未来时间")
private Date eventTime;
private Boolean needFutureCheck;
}