@Validated @Valid 的区别?
前者支持分组;方法级别
后者支持嵌套;
是否还有别的区别?
自定义校验注解实现?
区别:
https://www.cnblogs.com/xiaoqi/p/spring-valid.html
官方文档:
https://docs.spring.io/spring-framework/docs/4.1.x/spring-framework-reference/html/validation.html
Spring 的实现:
@NotBlankThe annotated element must not be null and must contain at least one non-whitespace character.@NotEmptyThe annotated element must not be null nor empty.Supported types are:- CharSequence (length of character sequence is evaluated)- Collection (collection size is evaluated)- Map (map size is evaluated)- Array (array length is evaluated)@NotNullThe annotated element must not be null. Accepts any type.@SizeThe annotated element size must be between the specified boundaries (included).Supported types are:- CharSequence (length of character sequence is evaluated)- Collection (collection size is evaluated)- Map (map size is evaluated)- Array (array length is evaluated)null elements are considered valid.@FutureThe annotated element must be an instant, date or time in the future.Now is defined by the ClockProvider attached to the Validator or ValidatorFactory. The default clockProvider defines the current time according to the virtual machine, applying the current default time zone if needed.Supported types are:java.util.Datejava.util.Calendarjava.time.Instantjava.time.LocalDatejava.time.LocalDateTimejava.time.LocalTimejava.time.MonthDayjava.time.OffsetDateTimejava.time.OffsetTimejava.time.Yearjava.time.YearMonthjava.time.ZonedDateTimejava.time.chrono.HijrahDatejava.time.chrono.JapaneseDatejava.time.chrono.MinguoDatejava.time.chrono.ThaiBuddhistDatenull elements are considered valid.
正则表达式校验:@Pattern
/** Jakarta Bean Validation API** License: Apache License, Version 2.0* See the license.txt file in the root directory or <http://www.apache.org/licenses/LICENSE-2.0>.*/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}.* <p>* 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 valueprivate 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();}}
之前还用过 hibernate 的实现;
