springMVC的验证注解

Posted by Zeusro on February 9, 2018
👈🏻 Select language

Bean Validation 规范内嵌的约束注解定义

1
2
3
4
5
6
7
8
9
10
11
12
13
14
约束注解名称	约束注解说明
@Null	验证对象是否为空
@NotNull	验证对象是否为非空
@AssertTrue	验证 Boolean 对象是否为 true
@AssertFalse	验证 Boolean 对象是否为 false
@Min	验证 Number 和 String 对象是否大等于指定的值
@Max	验证 Number 和 String 对象是否小等于指定的值
@DecimalMin	验证 Number 和 String 对象是否大等于指定的值,小数存在精度
@DecimalMax	验证 Number 和 String 对象是否小等于指定的值,小数存在精度
@Size	验证对象(Array,Collection,Map,String)长度是否在给定的范围之内
@Digits	验证 Number 和 String 的构成是否合法
@Past	验证 Date 和 Calendar 对象是否在当前时间之前
@Future	验证 Date 和 Calendar 对象是否在当前时间之后
@Pattern	验证 String 对象是否符合正则表达式的规则

querystring接收参数/ POST Form接收参数

这两种合在一起写是因为他们接收的方式都是一样的,可以用多个字段分开接收

  • 典型的POST Multi Form 示例
@Validated
@RestController
public class PictureAPIs {
    public ApiResult add(@RequestParam("file") MultipartFile file,
                         @NotNull(message = "xxx不得为空!")
                         @Size(min = 32, max = 32, message = "必须是32位的字符串")
                         @RequestParam String gidUnique,                         
                         @Pattern(regexp = "^(taobao_picture_upload|taobao_product_img_upload|taobao_item_img_upload|taobao_product_add)$",message = "type可选值:XXX")
                         @RequestParam("type") String type,                         
                         @RequestParam("i") String i) {
                         }
}
  • @Validated @Validated是最重要的,在每个需要验证控制器参数的 API 上面都需要加上这个注解

  • @RequestParam 这个是很重要的,每个提交的参数都需要加上这个标签@RequestParam("file")表示接收 name=file 的参数提交.

  • @NotNull 非空验证,这个很常见

  • @Size 字符串长度上下限

  • @Pattern 正则

接收JSON参数

1
2
3
4
5
6
@RequestMapping(value = "/api/picture/add/base64",method = RequestMethod.POST, produces = "application/json;charset=UTF-8")
    public ApiResult add(
            @Validated
            @RequestBody PictureAddBase64RequestBody body,
            @CookieValue(name = CookieMessageConst.ACCESS_TOKEN_KEY, required = false) String token) {
            }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class PictureAddBase64RequestBody extends PictureAddBaseRequestBody {

    private static final long serialVersionUID = 6185318090948651724L;
    @NotNull(message = "base64不得为空!")
    String base64;

    public String getBase64() {
        return base64;
    }

    public void setBase64(String base64) {
        this.base64 = base64;
    }

}

以这个为例,参数的校验标签放在PictureAddBase64RequestBody的字段上面

其他

  • 验证方法
1
2
3
4
5
 //验证 
 public static<T> void validate(T t){ 
     Validator validator = factory.getValidator();
      Set<ConstraintViolation<T>> constraintViolations = validator.validate(t); 
      for(ConstraintViolation<T> constraintViolation : constraintViolations) { System.out.println(constraintViolation.getMessage()); } }

参考链接:

  1. 自定义注解与参数验证
  2. Java注解 + 基于注解 & 拦截器实现登录验证 / 权限控制
  3. Bean Validation constraints
  4. Bean Validation 技术规范特性概述
  5. SpringMVC数据验证——第七章 注解式控制器的数据验证、类型转换及格式化——跟着开涛学SpringMVC

Built-in Constraint Annotation Definitions in Bean Validation Specification

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Constraint Annotation Name	Constraint Annotation Description
@Null	Validates that the object is null
@NotNull	Validates that the object is not null
@AssertTrue	Validates that the Boolean object is true
@AssertFalse	Validates that the Boolean object is false
@Min	Validates that Number and String objects are greater than or equal to the specified value
@Max	Validates that Number and String objects are less than or equal to the specified value
@DecimalMin	Validates that Number and String objects are greater than or equal to the specified value, with decimal precision
@DecimalMax	Validates that Number and String objects are less than or equal to the specified value, with decimal precision
@Size	Validates that the object (Array, Collection, Map, String) length is within the given range
@Digits	Validates that the composition of Number and String is legal
@Past	Validates that Date and Calendar objects are before the current time
@Future	Validates that Date and Calendar objects are after the current time
@Pattern	Validates that the String object conforms to the rules of the regular expression

Receiving Parameters via QueryString / POST Form

These two are written together because they receive parameters in the same way, and can receive multiple fields separately.

  • Typical POST Multi Form Example
@Validated
@RestController
public class PictureAPIs {
    public ApiResult add(@RequestParam("file") MultipartFile file,
                         @NotNull(message = "xxx cannot be empty!")
                         @Size(min = 32, max = 32, message = "Must be a 32-character string")
                         @RequestParam String gidUnique,                         
                         @Pattern(regexp = "^(taobao_picture_upload|taobao_product_img_upload|taobao_item_img_upload|taobao_product_add)$",message = "type optional values:XXX")
                         @RequestParam("type") String type,                         
                         @RequestParam("i") String i) {
                         }
}
  • @Validated @Validated is the most important. This annotation needs to be added to every API that requires controller parameter validation.

  • @RequestParam This is very important. Every submitted parameter needs to have this tag. @RequestParam("file") means receiving a parameter submission with name=file.

  • @NotNull Non-null validation, this is very common

  • @Size String length upper and lower limits

  • @Pattern Regular expression

Receiving JSON Parameters

1
2
3
4
5
6
@RequestMapping(value = "/api/picture/add/base64",method = RequestMethod.POST, produces = "application/json;charset=UTF-8")
    public ApiResult add(
            @Validated
            @RequestBody PictureAddBase64RequestBody body,
            @CookieValue(name = CookieMessageConst.ACCESS_TOKEN_KEY, required = false) String token) {
            }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class PictureAddBase64RequestBody extends PictureAddBaseRequestBody {

    private static final long serialVersionUID = 6185318090948651724L;
    @NotNull(message = "base64 cannot be empty!")
    String base64;

    public String getBase64() {
        return base64;
    }

    public void setBase64(String base64) {
        this.base64 = base64;
    }

}

Using this as an example, the parameter validation tags are placed on the fields of PictureAddBase64RequestBody.

Other

  • Validation Method
1
2
3
4
5
 //Validate 
 public static<T> void validate(T t){ 
     Validator validator = factory.getValidator();
      Set<ConstraintViolation<T>> constraintViolations = validator.validate(t); 
      for(ConstraintViolation<T> constraintViolation : constraintViolations) { System.out.println(constraintViolation.getMessage()); } }

Reference Links:

  1. Custom Annotations and Parameter Validation
  2. Java Annotations + Login Verification / Permission Control Based on Annotations & Interceptors
  3. Bean Validation constraints
  4. Bean Validation Technical Specification Feature Overview
  5. SpringMVC Data Validation - Chapter 7 Annotation-based Controller Data Validation, Type Conversion and Formatting - Learning SpringMVC with Kaitao

Встроенные определения аннотаций ограничений в спецификации Bean Validation

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Имя аннотации ограничения	Описание аннотации ограничения
@Null	Проверяет, является ли объект null
@NotNull	Проверяет, является ли объект не null
@AssertTrue	Проверяет, является ли Boolean объект true
@AssertFalse	Проверяет, является ли Boolean объект false
@Min	Проверяет, больше или равно ли Number и String объекты указанному значению
@Max	Проверяет, меньше или равно ли Number и String объекты указанному значению
@DecimalMin	Проверяет, больше или равно ли Number и String объекты указанному значению, с десятичной точностью
@DecimalMax	Проверяет, меньше или равно ли Number и String объекты указанному значению, с десятичной точностью
@Size	Проверяет, находится ли длина объекта (Array, Collection, Map, String) в заданном диапазоне
@Digits	Проверяет, является ли состав Number и String допустимым
@Past	Проверяет, находятся ли Date и Calendar объекты до текущего времени
@Future	Проверяет, находятся ли Date и Calendar объекты после текущего времени
@Pattern	Проверяет, соответствует ли String объект правилам регулярного выражения

Получение параметров через QueryString / POST Form

Эти два написаны вместе, потому что они получают параметры одинаковым способом и могут получать несколько полей отдельно.

  • Типичный пример POST Multi Form
@Validated
@RestController
public class PictureAPIs {
    public ApiResult add(@RequestParam("file") MultipartFile file,
                         @NotNull(message = "xxx не может быть пустым!")
                         @Size(min = 32, max = 32, message = "Должна быть 32-символьная строка")
                         @RequestParam String gidUnique,                         
                         @Pattern(regexp = "^(taobao_picture_upload|taobao_product_img_upload|taobao_item_img_upload|taobao_product_add)$",message = "type опциональные значения:XXX")
                         @RequestParam("type") String type,                         
                         @RequestParam("i") String i) {
                         }
}
  • @Validated @Validated является наиболее важным. Эта аннотация должна быть добавлена к каждому API, которое требует проверки параметров контроллера.

  • @RequestParam Это очень важно. Каждый отправленный параметр должен иметь этот тег. @RequestParam("file") означает получение отправки параметра с name=file.

  • @NotNull Проверка на не-null, это очень распространено

  • @Size Верхний и нижний пределы длины строки

  • @Pattern Регулярное выражение

Получение JSON параметров

1
2
3
4
5
6
@RequestMapping(value = "/api/picture/add/base64",method = RequestMethod.POST, produces = "application/json;charset=UTF-8")
    public ApiResult add(
            @Validated
            @RequestBody PictureAddBase64RequestBody body,
            @CookieValue(name = CookieMessageConst.ACCESS_TOKEN_KEY, required = false) String token) {
            }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class PictureAddBase64RequestBody extends PictureAddBaseRequestBody {

    private static final long serialVersionUID = 6185318090948651724L;
    @NotNull(message = "base64 не может быть пустым!")
    String base64;

    public String getBase64() {
        return base64;
    }

    public void setBase64(String base64) {
        this.base64 = base64;
    }

}

Используя это в качестве примера, теги проверки параметров размещаются на полях PictureAddBase64RequestBody.

Другое

  • Метод проверки
1
2
3
4
5
 //Проверка 
 public static<T> void validate(T t){ 
     Validator validator = factory.getValidator();
      Set<ConstraintViolation<T>> constraintViolations = validator.validate(t); 
      for(ConstraintViolation<T> constraintViolation : constraintViolations) { System.out.println(constraintViolation.getMessage()); } }

Ссылки:

  1. Пользовательские аннотации и проверка параметров
  2. Java аннотации + Проверка входа / Управление разрешениями на основе аннотаций и перехватчиков
  3. Bean Validation constraints
  4. Обзор функций технической спецификации Bean Validation
  5. Проверка данных SpringMVC - Глава 7 Проверка данных контроллера на основе аннотаций, преобразование типов и форматирование - Изучение SpringMVC с Kaitao