来个栗子: ( @Pattern 验证 String 对象是否符合正则表达式的规则)
/*
* Jakarta Bean Validation API
*
* License: Apache License, Version 2.0
* See the license.txt file in the root directory or .
*/
package javax.validation.constraints;
import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
import static java.lang.annotation.ElementType.CONSTRUCTOR;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.PARAMETER;
import static java.lang.annotation.ElementType.TYPE_USE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.lang.annotation.Documented;
import java.lang.annotation.Repeatable;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import javax.validation.Constraint;
import javax.validation.Payload;
import javax.validation.constraints.Pattern.List;
/**
* The annotated {@code CharSequence} must match the specified regular expression.
* The regular expression follows the Java regular expression conventions
* see {@link java.util.regex.Pattern}.
*
* Accepts {@code CharSequence}. {@code null} elements are considered valid.
*
* @author Emmanuel Bernard
*/
@Target({
METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
@Retention(RUNTIME)
@Repeatable(List.class)
@Documented
@Constraint(validatedBy = {
})
public @interface Pattern {
/**
* @return the regular expression to match
*/
String regexp();
/**
* @return array of {@code Flag}s considered when resolving the regular expression
*/
Flag[] flags() default {
};
/**
* @return the error message template
*/
String message() default "{javax.validation.constraints.Pattern.message}";
/**
* @return the groups the constraint belongs to
*/
Class<?>[] groups() default {
};
/**
* @return the payload associated to the constraint
*/
Class<? extends Payload>[] payload() default {
};
/**
* Possible Regexp flags.
*/
public static enum Flag {
/**
* Enables Unix lines mode.
*
* @see java.util.regex.Pattern#UNIX_LINES
*/
UNIX_LINES( java.util.regex.Pattern.UNIX_LINES ),
/**
* Enables case-insensitive matching.
*
* @see java.util.regex.Pattern#CASE_INSENSITIVE
*/
CASE_INSENSITIVE( java.util.regex.Pattern.CASE_INSENSITIVE ),
/**
* Permits whitespace and comments in pattern.
*
* @see java.util.regex.Pattern#COMMENTS
*/
COMMENTS( java.util.regex.Pattern.COMMENTS ),
/**
* Enables multiline mode.
*
* @see java.util.regex.Pattern#MULTILINE
*/
MULTILINE( java.util.regex.Pattern.MULTILINE ),
/**
* Enables dotall mode.
*
* @see java.util.regex.Pattern#DOTALL
*/
DOTALL( java.util.regex.Pattern.DOTALL ),
/**
* Enables Unicode-aware case folding.
*
* @see java.util.regex.Pattern#UNICODE_CASE
*/
UNICODE_CASE( java.util.regex.Pattern.UNICODE_CASE ),
/**
* Enables canonical equivalence.
*
* @see java.util.regex.Pattern#CANON_EQ
*/
CANON_EQ( java.util.regex.Pattern.CANON_EQ );
//JDK flag value
private final int value;
private Flag(int value) {
this.value = value;
}
/**
* @return flag value as defined in {@link java.util.regex.Pattern}
*/
public int getValue() {
return value;
}
}
/**
* Defines several {@link Pattern} annotations on the same element.
*
* @see Pattern
*/
@Target({
METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
@Retention(RUNTIME)
@Documented
@interface List {
Pattern[] value();
}
}
因为这个是正则,使用频率高一点
注解Target:注解的作用目标
@Target(ElementType.TYPE)——接口、类、枚举、注解
@Target(ElementType.FIELD)——字段、枚举的常量
@Target(ElementType.METHOD)——方法
@Target(ElementType.PARAMETER)——方法参数
@Target(ElementType.CONSTRUCTOR) ——构造函数
@Target(ElementType.LOCAL_VARIABLE)——局部变量
@Target(ElementType.ANNOTATION_TYPE)——注解
@Target(ElementType.PACKAGE)——包
注解@Retention(注解存在的时机)
按生命周期来划分可分为3类:
1、RetentionPolicy.SOURCE:注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃;
2、RetentionPolicy.CLASS:注解被保留到class文件,但jvm加载class文件时候被遗弃,这是默认的生命周期;
3、RetentionPolicy.RUNTIME:注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在;
这3个生命周期分别对应于:Java源文件(.java文件) ---> .class文件 ---> 内存中的字节码。
注解@Repeatable
@Repeatable
是jdk8中新增的注解,使用如Spring中的@ComponentScan
注解。在没有@Repeatable
注解的的注解中,在同一个地方使用相同的注解会报错,有了此元注解注解的注解,就可以在同一个地方使用相同的注解。其官方文档如下
@Value
注解上的元注解@Repeatable
中的值,使用了@Values
注解,@Values
注解中包含的值类型是一个@Value
注解的数组!
这就解释了官方文档中@Repeatable
中值的使用。
@Repeatable(Skills.class) //在Skills类中可以使用多个这个注解
public class AnnotationClass {
@Value("hello")
@Value("world")
public void test(String var1, String var2) {
System.out.println(var1 + " " + var2);
}
}
@Null
验证对象是否为null
@NotNull
验证对象是否不为null, 无法查检长度为0的字符串
@NotBlank
检查约束字符串是不是Null还有被Trim的长度是否大于0,只对字符串,且会去掉前后空格.
@NotEmpty
检查约束元素是否为NULL或者是EMPTY.
Booelan检查
@AssertTrue
验证 Boolean 对象是否为 true
@AssertFalse
验证 Boolean 对象是否为 false
长度检查
@Size(min=, max=)
验证对象(Array,Collection,Map,String)长度是否在给定的范围之内
@Length(min=, max=)
Validates that the annotated string is between min and max included.
日期检查
@Past
验证 Date 和 Calendar 对象是否在当前时间之前,验证成立的话被注释的元素一定是一个过去的日期
@Future
验证 Date 和 Calendar 对象是否在当前时间之后 ,验证成立的话被注释的元素一定是一个将来的日期
@Pattern
验证 String 对象是否符合正则表达式的规则,被注释的元素符合制定的正则表达式,regexp:正则表达式 flags: 指定 Pattern.Flag 的数组,表示正则表达式的相关选项。
数值检查
建议使用在Stirng,Integer类型,不建议使用在int类型上,因为表单值为“”时无法转换为int,但可以转换为Stirng为”“,Integer为null
@Min
验证 Number 和 String 对象是否大等于指定的值
@Max
验证 Number 和 String 对象是否小等于指定的值
@DecimalMax
被标注的值必须不大于约束中指定的最大值. 这个约束的参数是一个通过BigDecimal定义的最大值的字符串表示.小数存在精度
@DecimalMin
被标注的值必须不小于约束中指定的最小值. 这个约束的参数是一个通过BigDecimal定义的最小值的字符串表示.小数存在精度
@Digits
验证 Number 和 String 的构成是否合法
@Digits
(integer=,fraction=) 验证字符串是否是符合指定格式的数字,interger指定整数精度,fraction指定小数精度。
@Range
(min=, max=) 被指定的元素必须在合适的范围内
@Range
(min=10000,max=50000,message=”range.bean.wage”)
@Valid
递归的对关联对象进行校验, 如果关联对象是个集合或者数组,那么对其中的元素进行递归校验,如果是一个map,则对其中的值部分进行校验.(是否进行递归验证)
@CreditCardNumber
信用卡验证
@Email
验证是否是邮件地址,如果为null,不进行验证,算通过验证。
@ScriptAssert
(lang= ,script=, alias=)
@URL
(protocol=,host=, port=,regexp=, flags=)
参考博客:https://blog.csdn.net/qq_28867949/article/details/78922520