Spring Boot 整合Hibernate Validator
Hibernate Validator提供了對請求引數的校驗,方便我們在開發中管理校驗資訊。本文通過簡單的示例描述在Spring Boot專案中使用Hibernate Validator。(本文僅描述Spring Boot如何使用,不再單獨展示單獨使用的說明,如果需要了解更多資訊,可以參考官方文件 )
在Spring Boot的web包中已經為我們引入了Validator的依賴,所以不再需要新增額外的依賴包,直接就可以使用。
一、校驗模式
Validator提供兩種校驗模式:普通校驗模式 、快速校驗模式
- 普通校驗模式:普通校驗模式會一次性校驗所有引數,並返回所有不符合要求的錯誤資訊。
- 快速校驗模式:快速校驗模式在校驗過程中,當遇到第一個不滿足條件的引數時就立即返回,不再繼續後面引數的校驗。
二、配置
在Spring Boot中使用Validator需要注意一個問題。預設情況下在控制器中通過使用@Valid
註解和校驗模型只能在POST
請求中生效,GET
請求沒有效果。所以,在配置時,我們需要用到Spring對Validator的拓展。配置資訊如下:
@Configuration public class ValidatorConfiguration { //配置1 @Bean public Validator validator() { ValidatorFactory validatorFactory = Validation.byProvider(HibernateValidator.class) .configure() .addProperty("hibernate.validator.fail_fast", "true") //快速驗證模式,有第一個引數不滿足條件直接返回 .buildValidatorFactory(); return validatorFactory.getValidator(); } //配置2 @Bean public MethodValidationPostProcessor methodValidationPostProcessor() { MethodValidationPostProcessor postProcessor = new MethodValidationPostProcessor(); postProcessor.setValidator(validator()); return postProcessor; } }
配置1是Validator的預設配置,而配置2則是對預設配置的拓展,解決了GET
請求引數的校驗。同時,在校驗模式上直接使用快速校驗,只要滿足一個引數不符合就立即返回錯誤資訊。如果所有資訊都返回,則取消配置即可。
三、錯誤資訊處理
在Validator配置中,預設的錯誤返回方式是通過BindingResult
物件進行返回的,而在Spring拓展中是通過ConstraintViolation
集合返回,對應的異常資訊也不一樣。
在web專案中,引數校驗異常資訊都需要經過自定義處理,封裝成統一的格式進行輸出。定義全域性異常處理並捕獲對應的異常進行處理是比較通用的一種方式。程式碼實現如下:
@ControllerAdvice public class GlobalExceptionHandler { /** * 未被關注的異常資訊,統一返回給客戶端為“系統異常” * * @param e * @return */ @ExceptionHandler(RuntimeException.class) @ResponseBody public JSONResult handler(RuntimeException e) { e.printStackTrace(); return new JSONResult(-1, "系統異常"); } /** * Hibernate Validator引數校驗異常處理 * * @param e * @return */ @ExceptionHandler(MethodArgumentNotValidException.class) @ResponseBody public JSONResult handler(MethodArgumentNotValidException e) { BindingResult bindingResult = e.getBindingResult(); ObjectError objectError = bindingResult.getAllErrors().get(0); return new JSONResult(-1, objectError.getDefaultMessage()); } /** * Spring Validator引數校驗異常處理 * * @param e * @return */ @ExceptionHandler(ConstraintViolationException.class) @ResponseBody public JSONResult handler(ConstraintViolationException e) { Set<ConstraintViolation<?>> constraintViolations = e.getConstraintViolations(); for (ConstraintViolation<?> constraintViolation : constraintViolations) { String message = constraintViolation.getMessage(); if (!StringUtils.isEmpty(message)) { //直接返回第一個錯誤資訊 return new JSONResult(-1, message); } } return new JSONResult(-1, "引數錯誤"); } }
由於採用的快速校驗模式,在處理異常時直接返回第一個錯誤資訊即可。
四、校驗模型和引數定義
- POST請求
在post
請求中我們需要定義一個校驗模型,並配置@Valid
註解進行使用。
public class UserLoginDto implements Serializable { //賬號 @NotBlank(message = "賬號不能為空") private String username; //驗證碼 @NotBlank(message = "驗證碼不能為空") private String code; //Getter Setter... }
@PostMapping(value = "/login") public User login(@RequestBody @Valid UserLoginDto account) { //do ... return null; }
-
GET請求
在
get
請求中稍有變化。
@GetMapping(value = "/info") public JSONResult userInfo(@NotEmpty(message = "ID不能為空") String userId) { //do ... return JSONResult.result(null); }
除了在引數中需要定義特定的註解資訊以外,還需要在控制器類名上加上@Validated
註解配置使用。此處只是做簡單的示例,更多註解資訊可以參考官方文件。
以上就是Validator在Spring Boot中的簡單使用,實際功能遠不止這些,具體情況建議參考官方文件。