通常狀況咱們前端向後端傳遞參數都是2種方式 JSON
或者表單提交
前端
所以本文分別講述JSON提交
參數校驗和表單提交
參數校驗在Spring Boot中是如何操做,以及校驗失敗如何統一轉交給異常處理類去處理的。java
Api設計以下:git
表單方式
: http://localhost:8080/get-args-valid?username=xxx&password=xxxgithub
JSON方式
: http://localhost:8080/post-args-validweb
{
"username":"123",
"password":"123"
}
複製代碼
採用JSON方式提交,因此設置content-type
以下:正則表達式
Content-Type
: application/jsonspring
新建一個Spring Boot項目json
Api以下設計:後端
/** * @author: hujiansong * @email: 1358199510@qq.com * @since: 2019/1/29 16:53 */
@RestController
public class ValidController {
@GetMapping("/get-args-valid")
public String getArgsValid(String username, String password) {
return null;
}
@PostMapping("/post-args-valid")
public String postArgsValid(@RequestBody User user) {
return null;
}
@Data
class User {
String username;
String password;
}
}
複製代碼
先講JSON
方式如何進行參數校驗app
JSON方式
:
@RestController
public class ValidController {
@PostMapping("/post-args-valid")
public String postArgsValid(@Valid<1> @RequestBody User user) {
return null;
}
@Data
static class User {
@NotNull(message = "用戶名不能爲空")<2>
String username;
@NotNull(message = "密碼不能爲空")
String password;
}
}
複製代碼
注意: 這裏內部類
User
須要加上static,不然json傳過來沒法解析
<1>: @Valid
表示這個實體參數交給Spring去校驗
<2>: @NotNull
校驗規則
如上2步操做就能夠完成參數校驗:
能夠看到如何password
不傳遞,spring 已經幫咱們作了參數校驗,再來看看表單方式
表單方式
:
@RestController
@Validated<1>
public class ValidController {
@GetMapping("/get-args-valid")
public String getArgsValid(@NotNull(message = "用戶名不能空")<2> String username, @NotNull(message = "密碼不能爲空") String password) {
return null;
}
}
複製代碼
一樣也是2步搞定
<1>: @Validated
,交給Spring去校驗
<2>: @NotNull
校驗規則
看看若是password
不傳遞會返回什麼:
可見,Spring已經替咱們作了參數校驗
Spring 還包含了不少校驗規則以下:
註解 | 解釋 |
---|---|
@Null | 被註釋的元素必須爲 null |
@NotNull | 被註釋的元素必須不爲 null |
@AssertTrue | 被註釋的元素必須爲 true |
@AssertFalse | 被註釋的元素必須爲 false |
@Min(value) | 被註釋的元素必須是一個數字,其值必須大於等於指定的最小值 |
@Max(value) | 被註釋的元素必須是一個數字,其值必須小於等於指定的最大值 |
@DecimalMin | 被註釋的元素必須是一個數字,其值必須大於等於指定的最小值 |
@DecimalMax | 被註釋的元素必須是一個數字,其值必須小於等於指定的最大值 |
@Size(max=, min=) | 被註釋的元素的大小必須在指定的範圍內 |
@Digits | 被註釋的元素必須是一個數字,其值必須在可接受的範圍內 |
@Past | 被註釋的元素必須是一個過去的日期 |
@Future | 被註釋的元素必須是一個未來的日期 |
@Pattern(regex=) | 被註釋的元素必須符合指定的正則表達式 |
上面介紹瞭如何讓Spring校驗咱們的參數,那麼能夠看到JSON
方式校驗返回的結果一大串,不是十分優雅。那麼利用統一異常處理則可優雅返回參數校驗結果。
JSON方式
:校驗失敗後,會拋出一個 MethodArgumentNotValidException
表單方式
:校驗失敗,會拋出一個ConstraintViolationException
所以只須要在統一異常處理類裏面處理這2個異常便可。
ExceptionHanlder
表單方式
:
@RestControllerAdvice
public class ExceptionHandler {
@org.springframework.web.bind.annotation.ExceptionHandler(ConstraintViolationException.class)
public Map<String, Object> methodArgNotValidException(ConstraintViolationException cve, HttpServletRequest httpServletRequest) {
Set<ConstraintViolation<?>> cves = cve.getConstraintViolations();
StringBuffer errorMsg = new StringBuffer();
cves.forEach(ex -> errorMsg.append(ex.getMessage()));
Map<String, Object> respMap = new HashMap<>(4);
respMap.put("code", -1);
respMap.put("msg", errorMsg);
return respMap;
}
}
複製代碼
從新調用:
JSON方式
:
@RestControllerAdvice
public class ExceptionHandler {
@org.springframework.web.bind.annotation.ExceptionHandler({MethodArgumentNotValidException.class})
public Map<String, Object> methodDtoNotValidException(Exception ex, HttpServletRequest request) {
MethodArgumentNotValidException c = (MethodArgumentNotValidException) ex;
List<ObjectError> errors = c.getBindingResult().getAllErrors();
StringBuffer errorMsg = new StringBuffer();
errors.stream().forEach(x -> {
errorMsg.append(x.getDefaultMessage()).append(";");
});
Map<String, Object> respMap = new HashMap<>(4);
respMap.put("code", -1);
respMap.put("msg", errorMsg);
return respMap;
}
}
複製代碼
一樣調用,此次username
爲空試試看: