若是開發普通 Java 程序的的話,你須要可能須要像下面這樣依賴:java
<dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator</artifactId> <version>6.0.9.Final</version> </dependency> <dependency> <groupId>javax.el</groupId> <artifactId>javax.el-api</artifactId> <version>3.0.0</version> </dependency> <dependency> <groupId>org.glassfish.web</groupId> <artifactId>javax.el</artifactId> <version>2.2.6</version> </dependency>
package com.test.valid.entity; import javax.validation.constraints.Email; import javax.validation.constraints.NotNull; import javax.validation.constraints.Pattern; import javax.validation.constraints.Size; public class Person { @NotNull(message = "id字段不能爲空") private String id; @Size(max = 20) @NotNull(message = "name字段不能爲空") private String name; @Pattern(regexp = "((^Man$|^Woman$|^UGM$))",message = "sex字段只能是Man、Woman、UGM") @NotNull(message = "sex字段不能爲空") private String sex; @Email(message = "email格式不正確") @NotNull(message = "email不能爲空") private String email; public Person() { } public Person(String id, String name, String sex, String email) { this.id = id; this.name = name; this.sex = sex; this.email = email; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } }
JSR提供的校驗註解:git
@Null
被註釋的元素必須爲 null@NotNull
被註釋的元素必須不爲 null@AssertTrue
被註釋的元素必須爲 true@AssertFalse
被註釋的元素必須爲 false@Min(value)
被註釋的元素必須是一個數字,其值必須大於等於指定的最小值@Max(value)
被註釋的元素必須是一個數字,其值必須小於等於指定的最大值@DecimalMin(value)
被註釋的元素必須是一個數字,其值必須大於等於指定的最小值@DecimalMax(value)
被註釋的元素必須是一個數字,其值必須小於等於指定的最大值@Size(max=, min=)
被註釋的元素的大小必須在指定的範圍內@Digits (integer, fraction)
被註釋的元素必須是一個數字,其值必須在可接受的範圍內@Past
被註釋的元素必須是一個過去的日期@Future
被註釋的元素必須是一個未來的日期@Pattern(regex=,flag=)
被註釋的元素必須符合指定的正則表達式Hibernate Validator提供的校驗註解:web
@NotBlank(message =)
驗證字符串非null,且長度必須大於0@Email
被註釋的元素必須是電子郵箱地址@Length(min=,max=)
被註釋的字符串的大小必須在指定的範圍內@NotEmpty
被註釋的字符串的必須非空@Range(min=,max=,message=)
被註釋的元素必須在合適的範圍內咱們在須要驗證的參數上加上了@Valid
註解,若是驗證失敗,它將拋出MethodArgumentNotValidException
。默認狀況下,Spring會將此異常轉換爲HTTP Status 400(錯誤請求)。正則表達式
1 package com.test.valid.controller; 2 3 import com.test.valid.entity.Person; 4 import org.springframework.http.ResponseEntity; 5 import org.springframework.validation.annotation.Validated; 6 import org.springframework.web.bind.annotation.*; 7 8 import javax.validation.Valid; 9 import javax.validation.constraints.Max; 10 11 @Validated 12 @RestController 13 @RequestMapping("/valid") 14 public class PersonController { 15 16 @PostMapping("/person") 17 public ResponseEntity<Person> getPerson(@Valid Person person) { 18 return ResponseEntity.ok().body(person); 19 } 20 21 @GetMapping("/person/{id}") 22 public ResponseEntity<Integer> getPersonByID(@Valid @PathVariable("id") @Max(value = 5,message = "超過 id 的範圍了") Integer id) { 23 return ResponseEntity.ok().body(id); 24 } 25 }
測試驗證:spring
{ "timestamp": "2019-10-25T03:05:15.018+0000", "status": 400, "error": "Bad Request", "errors": [ { "codes": [ "Email.person.email", "Email.email", "Email.java.lang.String", "Email" ], "arguments": [ { "codes": [ "person.email", "email" ], "arguments": null, "defaultMessage": "email", "code": "email" }, [], { "defaultMessage": ".*", "codes": [ ".*" ], "arguments": null } ], "defaultMessage": "email格式不正確", "objectName": "person", "field": "email", "rejectedValue": "123.com", "bindingFailure": false, "code": "Email" } ], "message": "Validation failed for object='person'. Error count: 1", "path": "/valid/person" }
controller:api
必定必定不要忘記在類上加上 Validated
註解了,這個參數能夠告訴 Spring 去校驗方法參數。app
如上面的代碼。ide
咱們還能夠驗證任何Spring組件的輸入,而不是驗證控制器級別的輸入,咱們可使用@Validated
和@Valid
註釋的組合來實現這一需求。測試
必定必定不要忘記在類上加上 Validated
註解了,這個參數能夠告訴 Spring 去校驗方法參數。this
package com.test.valid; import javax.validation.Constraint; import javax.validation.Payload; import java.lang.annotation.*; @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) @Constraint(validatedBy = RegionValidator.class) @Documented public @interface Region { String message() default "Region 值不在可選範圍內"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; }
package com.test.valid; import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; import java.util.HashSet; public class RegionValidator implements ConstraintValidator<Region, String> { public void initialize(Region constraint) { } public boolean isValid(String obj, ConstraintValidatorContext context) { HashSet<Object> regions = new HashSet<>(); regions.add("China"); regions.add("China-Taiwan"); regions.add("China-HongKong"); return regions.contains(obj); } }
@Region private String region;
{ "timestamp": "2019-10-25T03:20:28.459+0000", "status": 400, "error": "Bad Request", "errors": [ { "codes": [ "Region.person.region", "Region.region", "Region.java.lang.String", "Region" ], "arguments": [ { "codes": [ "person.region", "region" ], "arguments": null, "defaultMessage": "region", "code": "region" } ], "defaultMessage": "Region 值不在可選範圍內", "objectName": "person", "field": "region", "rejectedValue": "China-shanghai", "bindingFailure": false, "code": "Region" } ], "message": "Validation failed for object='person'. Error count: 1", "path": "/valid/person" }