Spring Boot統一異常處理以及參數校驗

Spring Boot統一異常處理以及參數校驗

參數自動校驗

通常狀況咱們前端向後端傳遞參數都是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步操做就能夠完成參數校驗:

JSON方式校驗

能夠看到如何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爲空試試看:

JSON方式異常捕獲

完整的代碼

相關文章
相關標籤/搜索