springboot validation 使用说明

快来打我* 2023-02-25 10:22 68阅读 0赞

springboot validation 使用说明

应用:检验输入参数的格式,如参数是否为null、数值最大最小值等

一些简单的参数检验可以直接在前端检验,验证通过后再传递到后端

*******************

导入 jar 包

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-validation</artifactId>
  4. </dependency>

springboot 2.3之后移除了hibernate-validator,需导入jar包

#

*******************

相关类与接口

BindingResult:**存储验证异常信息**

  1. public interface BindingResult extends Errors {
  2. String MODEL_KEY_PREFIX = BindingResult.class.getName() + ".";
  3. Object getTarget();
  4. Map<String, Object> getModel();
  5. Object getRawFieldValue(String field);
  6. PropertyEditor findEditor(@Nullable String field, @Nullable Class<?> valueType);
  7. PropertyEditorRegistry getPropertyEditorRegistry();
  8. String[] resolveMessageCodes(String errorCode);
  9. String[] resolveMessageCodes(String errorCode, String field);
  10. void addError(ObjectError error);
  11. default void recordFieldValue(String field, Class<?> type, @Nullable Object value) {
  12. }
  13. default void recordSuppressedField(String field) {
  14. }
  15. default String[] getSuppressedFields() {
  16. return new String[0];
  17. }
  18. }

说明:bindingResult需要申明在pojo后面,不能跟在简单参数(如Integer、String等)后面,否则会报如下错:

  1. An Errors/BindingResult argument is expected to be declared immediately after the model
  2. attribute, the @RequestBody or the @RequestPart arguments to which they apply: public
  3. java.lang.String com.example.demo.controller.HelloController.hello3(java.lang.Integer,
  4. org.springframework.validation.BindingResult)

Errors

  1. public interface Errors {
  2. String NESTED_PATH_SEPARATOR = PropertyAccessor.NESTED_PROPERTY_SEPARATOR;
  3. String getObjectName();
  4. void setNestedPath(String nestedPath);
  5. String getNestedPath();
  6. void pushNestedPath(String subPath);
  7. void popNestedPath() throws IllegalStateException;
  8. void reject(String errorCode);
  9. void reject(String errorCode, String defaultMessage);
  10. void reject(String errorCode, @Nullable Object[] errorArgs, @Nullable String defaultMessage);
  11. void rejectValue(@Nullable String field, String errorCode);
  12. void rejectValue(@Nullable String field, String errorCode, String defaultMessage);
  13. void rejectValue(@Nullable String field, String errorCode,
  14. @Nullable Object[] errorArgs, @Nullable String defaultMessage);
  15. ***********
  16. allErrors
  17. boolean hasErrors();
  18. int getErrorCount();
  19. List<ObjectError> getAllErrors();
  20. void addAllErrors(Errors errors);
  21. ***********
  22. globalErrors
  23. boolean hasGlobalErrors();
  24. int getGlobalErrorCount();
  25. List<ObjectError> getGlobalErrors();
  26. ObjectError getGlobalError();
  27. ***********
  28. filedErrors
  29. boolean hasFieldErrors();
  30. boolean hasFieldErrors(String field);
  31. int getFieldErrorCount();
  32. int getFieldErrorCount(String field);
  33. List<FieldError> getFieldErrors();
  34. List<FieldError> getFieldErrors(String field);
  35. FieldError getFieldError();
  36. FieldError getFieldError(String field);
  37. Object getFieldValue(String field);
  38. Class<?> getFieldType(String field);

FieldError

  1. public class FieldError extends ObjectError {
  2. private final String field;
  3. private final Object rejectedValue;
  4. private final boolean bindingFailure;
  5. public FieldError(String objectName, String field, String defaultMessage) {
  6. public FieldError(String objectName, String field, @Nullable Object rejectedValue,
  7. public String getField() {
  8. public Object getRejectedValue() {
  9. public boolean isBindingFailure() {
  10. public boolean equals(@Nullable Object other) {
  11. public int hashCode() {
  12. public String toString() {

@Valid:jsr-303提供注解,开启验证,不支持注解分组功能

  1. @Target({ElementType.METHOD, ElementType.FIELD, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
  2. @Retention(RetentionPolicy.RUNTIME)
  3. @Documented
  4. public @interface Valid {
  5. }

注解在方法、字段**(可嵌套)**、构造函数、方法参数、类上

@Validated:spring提供注解,开启验证,支持注解分组功能

  1. @Target({ElementType.TYPE, ElementType.METHOD, ElementType.PARAMETER})
  2. @Retention(RetentionPolicy.RUNTIME)
  3. @Documented
  4. public @interface Validated {
  5. Class<?>[] value() default {};
  6. }

注解在类、方法、方法参数上,不支持注解在字段上(即不能嵌套),推荐优先使用该注解

*******************

验证注解

javax.validation 注解

  1. ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkzMTYyNQ_size_16_color_FFFFFF_t_70][]

org.hibernate.validator 注解

  1. ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkzMTYyNQ_size_16_color_FFFFFF_t_70 1][]

*****************

部分注解

AssertFalse:注释字段为false

  1. @Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
  2. @Retention(RetentionPolicy.RUNTIME)
  3. @Repeatable(AssertFalse.List.class)
  4. @Documented
  5. @Constraint(
  6. validatedBy = {}
  7. )
  8. public @interface AssertFalse {
  9. String message() default "{javax.validation.constraints.AssertFalse.message}";
  10. Class<?>[] groups() default {};
  11. Class<? extends Payload>[] payload() default {};
  12. @Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
  13. @Retention(RetentionPolicy.RUNTIME)
  14. @Documented
  15. public @interface List {
  16. AssertFalse[] value();
  17. }
  18. }

@DecimalMin:最小值

  1. @Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
  2. @Retention(RetentionPolicy.RUNTIME)
  3. @Repeatable(DecimalMin.List.class)
  4. @Documented
  5. @Constraint(
  6. validatedBy = {}
  7. )
  8. public @interface DecimalMin {
  9. String message() default "{javax.validation.constraints.DecimalMin.message}";
  10. Class<?>[] groups() default {};
  11. Class<? extends Payload>[] payload() default {};
  12. String value();
  13. boolean inclusive() default true;
  14. @Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
  15. @Retention(RetentionPolicy.RUNTIME)
  16. @Documented
  17. public @interface List {
  18. DecimalMin[] value();
  19. }
  20. }

FutureOrPresent:标注字段日期为当前时间、将来时间

  1. @Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
  2. @Retention(RetentionPolicy.RUNTIME)
  3. @Repeatable(FutureOrPresent.List.class)
  4. @Documented
  5. @Constraint(
  6. validatedBy = {}
  7. )
  8. public @interface FutureOrPresent {
  9. String message() default "{javax.validation.constraints.FutureOrPresent.message}";
  10. Class<?>[] groups() default {};
  11. Class<? extends Payload>[] payload() default {};
  12. @Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
  13. @Retention(RetentionPolicy.RUNTIME)
  14. @Documented
  15. public @interface List {
  16. FutureOrPresent[] value();
  17. }
  18. }

发表评论

表情:
评论列表 (有 0 条评论,68人围观)

还没有评论,来说两句吧...

相关阅读

    相关 SpringBoot使用validator校验

    在前台表单验证的时候,通常会校验一些数据的可行性,比如是否为空,长度,身份证,邮箱等等,那么这样是否是安全的呢,答案是否定的。因为也可以通过模拟前台请求等工具来直接提交到后台,