1. 程式人生 > >springmvc引數效驗

springmvc引數效驗

SpringMVC引數校驗

Java的小本家 2018-11-13 22:02:23

使用SpringMVC時配合hibernate-validate進行引數的合法性校驗,能節省一定的程式碼量。

1.搭建Web工程並引入hibernate-validate依賴

<dependency>
 <groupId>org.hibernate.validator</groupId>
 <artifactId>hibernate-validator</artifactId>
 <version>6.0.7.Final</version>
</dependency> 

Maven依賴傳遞,自動依賴validation-api、jboss-logging、classmate。

SpringMVC引數校驗

 

2.使用校驗註解標註在屬性上(dto)

SpringMVC引數校驗

 

*每個註解都有message屬性,該屬性用於填寫校驗失敗時的異常描述資訊,當校驗失敗時可以獲取對應的message屬性值。

public class User {
 @NotNull(message="id不能為空!")
 private Integer id;
 
 @NotBlank(message="使用者名稱不能為空!")
 @Size(min=4,max=12,message="使用者名稱的長度在4~12之間!")
 private String username;
 @NotBlank(message="密碼不能為空!")
 private String password;
 
 @Email(message="非法郵箱!")
 private String email;
 public Integer getId() {
 return id;
 }
 public void setId(Integer id) {
 this.id = id;
 }
 public String getUsername() {
 return username;
 }
 public void setUsername(String username) {
 this.username = username;
 }
 public String getPassword() {
 return password;
 }
 public void setPassword(String password) {
 this.password = password;
 }
 public String getEmail() {
 return email;
 }
 public void setEmail(String email) {
 this.email = email;
 }
 public User() {
 super();
 }
}

3.控制層中使用dto接收引數並使用@Validated/@Valid註解開啟對引數的校驗

 *@Validated註解表示使用Spring的校驗機制,支援分組校驗,宣告在入參上。

 *@Valid註解表示使用Hibernate的校驗機制,不支援分組校驗,宣告在入參上。

 *在dto後面要緊跟BindingResult物件,該物件用於獲取當校驗失敗時的異常資訊。

@RestController
public class BaseController {
 @RequestMapping("/test")
 public User test(@Validated User user, BindingResult result) {
 if (result.hasErrors()) {
 List<ObjectError> errors = result.getAllErrors();
 for (ObjectError error : errors) {
 System.out.println(error.getDefaultMessage());
 }
 }
 return user;
 }
}

演示:

SpringMVC引數校驗

 

結果:

密碼不能為空!
id不能為空!
使用者名稱的長度在4~12之間!

*校驗的順序是隨機的,因此程式不能依賴校驗的順序去做相關的邏輯處理。

4.分組校驗

每個校驗註解都有group屬性用於指定校驗所屬的組,其值是Class陣列,在Controller中使用@Validated註解開啟對引數的校驗時若指定要進行校驗的組,那麼只有組相同的屬性才會被進行校驗(預設全匹配)

Class<?>[] groups() default { };

一般定義標識介面作為組資源

public interface GroupA {
}
public interface GroupB {
}

使用校驗註解標註在屬性上並進行分組

public class User {
 @NotNull(message="id不能為空!",groups = {GroupA.class})
 private Integer id;
 
 @NotBlank(message="使用者名稱不能為空!",groups = {GroupB.class})
 @Size(min=4,max=12,message="使用者名稱的長度在4~12之間!")
 private String username;
 @NotBlank(message="密碼不能為空!")
 private String password;
 
 @Email(message="非法郵箱!")
 private String email;
 public Integer getId() {
 return id;
 }
 public void setId(Integer id) {
 this.id = id;
 }
 public String getUsername() {
 return username;
 }
 public void setUsername(String username) {
 this.username = username;
 }
 public String getPassword() {
 return password;
 }
 public void setPassword(String password) {
 this.password = password;
 }
 public String getEmail() {
 return email;
 }
 public void setEmail(String email) {
 this.email = email;
 }
 public User() {
 super();
 }
}

Controller中使用@Validated註解開啟對引數的校驗並指定校驗的組,那麼只有組相同的屬性才會被進行校驗(預設全匹配)

@RestController
public class BaseController {
 @RequestMapping("/test")
 public User test(@Validated(value= {GroupB.class}) User user, BindingResult result) {
 if (result.hasErrors()) {
 List<ObjectError> errors = result.getAllErrors();
 for (ObjectError error : errors) {
 System.out.println(error.getDefaultMessage());
 }
 }
 return user;
 }
}

演示:

SpringMVC引數校驗

 

結果:

使用者名稱不能為空!