001package cn.sticki.validator.spel;
002
003import javax.validation.constraints.NotNull;
004import java.lang.annotation.*;
005
006/**
007 * 将注解标记为由 {@link SpelValid} 进行校验的Bean验证约束。
008 * <p>
009 * 该注解的属性 {@link SpelConstraint#validatedBy()} 用于指定校验器的实现类,实现类需要实现 {@link SpelConstraintValidator} 接口。
010 * <p>
011 * 每个约束注释必须包含以下属性:
012 * <ul>
013 *     <li>{@code String message() default [...];} 用于指定约束校验失败时的错误消息。
014 *     </li>
015 *     <li>{@code String condition() default "";} 用于指定约束开启条件的SpEL表达式。
016 *     当 表达式为空 或 计算结果为true 时,才会对带注解的元素进行校验。
017 *     </li>
018 *     <li>{@code String[] group() default {};} 用于指定约束开启的分组条件,必须为合法的SpEL表达式。
019 *     当分组信息不为空时,只有当 {@link SpelValid#spelGroups()} 中的分组信息与此处的分组信息有交集时,才会对带注解的元素进行校验。
020 *     其计算结果可以是任何类型,但只有两个计算结果完全相等时,才被认为是相等的。
021 *     </li>
022 * </ul>
023 * <p>
024 * 这里有一些定义约束的例子,可以参考:
025 * <ul>
026 *     <li>{@link cn.sticki.validator.spel.constrain.SpelAssert}</li>
027 *     <li>{@link cn.sticki.validator.spel.constrain.SpelNotNull}</li>
028 * </ul>
029 *
030 * @author 阿杆
031 * @version 1.0
032 * @see SpelValid
033 * @see SpelConstraintValidator
034 * @since 2024/4/11
035 */
036@NotNull
037@Documented
038@Target(ElementType.ANNOTATION_TYPE)
039@Retention(RetentionPolicy.RUNTIME)
040public @interface SpelConstraint {
041
042        /**
043         * 校验器的实现类,用于校验被标记的注解。
044         */
045        Class<? extends SpelConstraintValidator<?>> validatedBy();
046
047}