@Valid 數據校驗 + 自定義全局異常信息


關於javax.validation.Validator校驗的使用

  • 對於要校驗的實體類:其需要校驗的字段上需要添加注解

常用注解

實際例子

實體類Demo

使用:首先要拿到 validator的子類

Validator validator = Validation.buildDefaultValidatorFactory().getValidator();

其中方法可以參考 API
對實體類的校驗

Set<ConstraintViolation<Object>> set = validator.validate(obj,Default.class);
 

 

本文鏈接:https://blog.csdn.net/qq_38193966/article/details/95990268

———————————————— 

 

@Valid 數據校驗 + 自定義全局異常信息

我們常用@Valid做數據校驗,比如現在前端要新增一個用戶,我們可以這樣校驗:

@RestController public class UserController { @PostMapping("/user") public void addUser(@RequestBody @Valid RequestDTO requestDTO){ //其余業務處理 System.out.println(requestDTO.toString()); } } 

傳入的數據規則如下列代碼所示:


@Data public class RequestDTO { @NotNull(message = "名字不能為空") String name; @NotEmpty(message = "密碼不能為空") String password; @Override public String toString() { return "name=" + name + ",password=" + password; } } 

假設我們模仿前端偽造了一個非法數據(例如密碼為空):

{ "name": "string", "password": "" } 

加了@Valid注解的程序就能按我們的預期報錯:

{ "timestamp": "2019-08-26T14:12:02.542+0000", "status": 400, "error": "Bad Request", "errors": [ { "codes": [ "NotEmpty.requestDTO.password", "NotEmpty.password", "NotEmpty.java.lang.String", "NotEmpty" ], "arguments": [ { "codes": [ "requestDTO.password", "password" ], "arguments": null, "defaultMessage": "password", "code": "password" } ], "defaultMessage": "密碼不能為空", "objectName": "requestDTO", "field": "password", "rejectedValue": "", "bindingFailure": false, "code": "NotEmpty" } ], "message": "Validation failed for object='requestDTO'. Error count: 1", "path": "/user" } 

報錯信息改進

但這樣的報錯信息明顯太冗余了,我們想簡化下,只拋出有問題字段的報錯信息,這回就可以結合我們的全局異常進行處理:

1.編寫自定義異常處理類,綁定要處理的異常

這里我們注意到@Valid拋出的異常類是MethodArgumentNotValidException ,所以我們將捕獲該異常,並對它重新自定義異常信息

@ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(value = MethodArgumentNotValidException.class) @ResponseBody public JsonResult MyExceptionHandle(MethodArgumentNotValidException exception){ exception.printStackTrace(); BindingResult result = exception.getBindingResult(); StringBuilder errorMsg = new StringBuilder() ; if (result.hasErrors()) { List<FieldError> fieldErrors = result.getFieldErrors(); fieldErrors.forEach(error -> { System.out.println("field" + error.getField() + ", msg:" + error.getDefaultMessage()); errorMsg.append(error.getDefaultMessage()).append("!"); }); } exception.printStackTrace(); return new JsonResult(-1,errorMsg.toString() ); } } 

上面的代碼就是取出里面的報錯信息,組裝成自己需要顯示的信息(這里我們封裝成一個json結構,包括狀態碼和信息返出去):

  1. 試驗成果

將剛剛的請求再發一遍,現在就可以看到,錯誤信息已經按照我們規定的格式返回了:

{ "code": -1, "msg": "密碼不能為空!" }

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM