1、引入依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
2、JSR-303 注解介紹
這里只列舉了 javax.validation
包下的注解,同理在 spring-boot-starter-web
包中也存在 hibernate-validator
驗證包,里面包含了一些 javax.validation
沒有的注解,有興趣的可以看看
注解 | 說明 |
---|---|
@NotNull |
限制必須不為null |
@NotEmpty |
驗證注解的元素值不為 null 且不為空(字符串長度不為0、集合大小不為0) |
@NotBlank |
驗證注解的元素值不為空(不為null、去除首位空格后長度為0),不同於@NotEmpty,@NotBlank只應用於字符串且在比較時會去除字符串的空格 |
@Pattern(value) |
限制必須符合指定的正則表達式 |
@Size(max,min) |
限制字符長度必須在 min 到 max 之間(也可以用在集合上) |
@Email |
驗證注解的元素值是Email,也可以通過正則表達式和flag指定自定義的email格式 |
@Max(value) |
限制必須為一個不大於指定值的數字 |
@Min(value) |
限制必須為一個不小於指定值的數字 |
@DecimalMax(value) |
限制必須為一個不大於指定值的數字 |
@DecimalMin(value) |
限制必須為一個不小於指定值的數字 |
@Null |
限制只能為null(很少用) |
@AssertFalse |
限制必須為false (很少用) |
@AssertTrue |
限制必須為true (很少用) |
@Past |
限制必須是一個過去的日期 |
@Future |
限制必須是一個將來的日期 |
@Digits(integer,fraction) |
限制必須為一個小數,且整數部分的位數不能超過 integer,小數部分的位數不能超過 fraction (很少用) |
3、添加驗證
由於方法入參可以是基本數據類型,也可以是對象,因此驗證可以加在對象的屬性上,也可以直接在Controller入參上添加
(1)在對象屬性上添加驗證
package com.example.demo.entity; import lombok.Data; import org.hibernate.validator.constraints.Length; import javax.validation.constraints.Email; import javax.validation.constraints.Max; import javax.validation.constraints.Min; import javax.validation.constraints.NotBlank; import java.util.Date; @Data public class UserValidated { @NotBlank(message = "username不允許為空") @Length(min = 4,max = 8,message = "username長度要在4-8之間") private String username; @Email(message = "郵箱格式不正確") private String email; @Max(value = 200,message = "年齡最大不能超過200") @Min(value = 10,message = "年齡最小不能小於10歲") private int age; private Date date; }
(2)Controller入參添加驗證
@Validated
@Controller
@RequestMapping("/test")
@Api(value = "SpringBoot測試接口2")
public class UserTestController2 {
@ResponseBody @PostMapping(value ="/validated") @ApiOperation(value="validated表單驗證測試") @ApiImplicitParams( {@ApiImplicitParam(paramType="query", name = "email", value = "郵箱", dataType = "String"), @ApiImplicitParam(paramType="query", name = "username", value = "用戶名", dataType = "String"), @ApiImplicitParam(paramType="query", name = "age", value = "年齡", dataType = "String")}) public String validated(@NotBlank(message = "username不允許為空") @Length(min = 4,max = 8,message = "username長度要在4-8之間") String username, @Email(message = "郵箱格式不正確")String email, @Max(value = 200,message = "年齡最大不能超過200") @Min(value = 10,message = "年齡最小不能小於10歲")int age){ return "OK"; }
}
說明:無論是哪一種方式的驗證,Controller類上必須添加@Validated注解以打開驗證。
4、驗證
5、驗證組
實際開發中可能存在在有的場景需要驗證某一個字段,而在有的場景不需要驗證的情況,例如,一個對象的ID,在新增時,可以為空,但是在更新時,不允許為空,這種情況下就需要使用驗證組。將id單獨分一個驗證組來驗證。
(1)定義分組驗證器
package com.example.demo.utils; public class ValidGroups { public interface Update{ } public interface Default{ } }
(2)在實體類上使用驗證組
package com.example.demo.entity; import com.example.demo.utils.ValidGroups; import lombok.Data; import org.hibernate.validator.constraints.Length; import javax.validation.constraints.*; import java.util.Date; @Data public class UserValidated2 { @NotBlank(message = "id不允許為空", groups = ValidGroups.Update.class) private String id; @NotBlank(message = "username不允許為空", groups = ValidGroups.Default.class) private String username; @NotBlank(message = "email不允許為空", groups = ValidGroups.Default.class) private String email; @NotNull(message = "age不允許為空",groups = ValidGroups.Default.class) private int age; }
(3)控制層
@ResponseBody @PostMapping(value ="/validated4") @ApiOperation(value="validated表單驗證測試") public String validatedUpdate(@Validated(value = {ValidGroups.Update.class,ValidGroups.Default.class}) @ModelAttribute UserValidated2 user){ return "OK"; } @ResponseBody @PostMapping(value ="/validated5") @ApiOperation(value="validated表單驗證測試") public String validatedInsert(@Validated(value = ValidGroups.Default.class) @ModelAttribute UserValidated2 user){ return "OK"; }
(4)測試