springmvc引數效驗
阿新 • • 發佈:2018-11-29
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。
2.使用校驗註解標註在屬性上(dto)
*每個註解都有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; } }
演示:
結果:
密碼不能為空! 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; } }
演示:
結果:
使用者名稱不能為空!