springboot validation 使用说明
springboot validation 使用说明
应用:检验输入参数的格式,如参数是否为null、数值最大最小值等
一些简单的参数检验可以直接在前端检验,验证通过后再传递到后端
*******************
导入 jar 包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
springboot 2.3之后移除了hibernate-validator,需导入jar包
#
*******************
相关类与接口
BindingResult:**存储验证异常信息**
public interface BindingResult extends Errors {
String MODEL_KEY_PREFIX = BindingResult.class.getName() + ".";
Object getTarget();
Map<String, Object> getModel();
Object getRawFieldValue(String field);
PropertyEditor findEditor(@Nullable String field, @Nullable Class<?> valueType);
PropertyEditorRegistry getPropertyEditorRegistry();
String[] resolveMessageCodes(String errorCode);
String[] resolveMessageCodes(String errorCode, String field);
void addError(ObjectError error);
default void recordFieldValue(String field, Class<?> type, @Nullable Object value) {
}
default void recordSuppressedField(String field) {
}
default String[] getSuppressedFields() {
return new String[0];
}
}
说明:bindingResult需要申明在pojo后面,不能跟在简单参数(如Integer、String等)后面,否则会报如下错:
An Errors/BindingResult argument is expected to be declared immediately after the model
attribute, the @RequestBody or the @RequestPart arguments to which they apply: public
java.lang.String com.example.demo.controller.HelloController.hello3(java.lang.Integer,
org.springframework.validation.BindingResult)
Errors
public interface Errors {
String NESTED_PATH_SEPARATOR = PropertyAccessor.NESTED_PROPERTY_SEPARATOR;
String getObjectName();
void setNestedPath(String nestedPath);
String getNestedPath();
void pushNestedPath(String subPath);
void popNestedPath() throws IllegalStateException;
void reject(String errorCode);
void reject(String errorCode, String defaultMessage);
void reject(String errorCode, @Nullable Object[] errorArgs, @Nullable String defaultMessage);
void rejectValue(@Nullable String field, String errorCode);
void rejectValue(@Nullable String field, String errorCode, String defaultMessage);
void rejectValue(@Nullable String field, String errorCode,
@Nullable Object[] errorArgs, @Nullable String defaultMessage);
***********
allErrors
boolean hasErrors();
int getErrorCount();
List<ObjectError> getAllErrors();
void addAllErrors(Errors errors);
***********
globalErrors
boolean hasGlobalErrors();
int getGlobalErrorCount();
List<ObjectError> getGlobalErrors();
ObjectError getGlobalError();
***********
filedErrors
boolean hasFieldErrors();
boolean hasFieldErrors(String field);
int getFieldErrorCount();
int getFieldErrorCount(String field);
List<FieldError> getFieldErrors();
List<FieldError> getFieldErrors(String field);
FieldError getFieldError();
FieldError getFieldError(String field);
Object getFieldValue(String field);
Class<?> getFieldType(String field);
FieldError
public class FieldError extends ObjectError {
private final String field;
private final Object rejectedValue;
private final boolean bindingFailure;
public FieldError(String objectName, String field, String defaultMessage) {
public FieldError(String objectName, String field, @Nullable Object rejectedValue,
public String getField() {
public Object getRejectedValue() {
public boolean isBindingFailure() {
public boolean equals(@Nullable Object other) {
public int hashCode() {
public String toString() {
@Valid:jsr-303提供注解,开启验证,不支持注解分组功能
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Valid {
}
注解在方法、字段**(可嵌套)**、构造函数、方法参数、类上
@Validated:spring提供注解,开启验证,支持注解分组功能
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Validated {
Class<?>[] value() default {};
}
注解在类、方法、方法参数上,不支持注解在字段上(即不能嵌套),推荐优先使用该注解
*******************
验证注解
javax.validation 注解
![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkzMTYyNQ_size_16_color_FFFFFF_t_70][]
org.hibernate.validator 注解
![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkzMTYyNQ_size_16_color_FFFFFF_t_70 1][]
*****************
部分注解
AssertFalse:注释字段为false
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
@Repeatable(AssertFalse.List.class)
@Documented
@Constraint(
validatedBy = {}
)
public @interface AssertFalse {
String message() default "{javax.validation.constraints.AssertFalse.message}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface List {
AssertFalse[] value();
}
}
@DecimalMin:最小值
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
@Repeatable(DecimalMin.List.class)
@Documented
@Constraint(
validatedBy = {}
)
public @interface DecimalMin {
String message() default "{javax.validation.constraints.DecimalMin.message}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
String value();
boolean inclusive() default true;
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface List {
DecimalMin[] value();
}
}
FutureOrPresent:标注字段日期为当前时间、将来时间
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
@Repeatable(FutureOrPresent.List.class)
@Documented
@Constraint(
validatedBy = {}
)
public @interface FutureOrPresent {
String message() default "{javax.validation.constraints.FutureOrPresent.message}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface List {
FutureOrPresent[] value();
}
}
还没有评论,来说两句吧...