Унифицированная обработка исключений Spring Boot и проверка параметров

Spring Boot

Унифицированная обработка исключений Spring Boot и проверка параметров

Автоматическая проверка параметров

В общем, есть два способа передать параметры от внешнего интерфейса к внутреннему.JSONили表单提交

Поэтому в данной статье обсуждаетсяJSON提交контрольная сумма параметра表单提交Как проверка параметров работает в Spring Boot и как ошибки проверки равномерно передаются в класс обработки исключений для обработки.

API разработан следующим образом:

表单方式: http://localhost:8080/get-args-valid?username=xxx&password=xxx

JSON方式: http://localhost:8080/post-args-valid

{
    "username":"123",
    "password":"123"
}

Отправьте в формате JSON, поэтому установитеcontent-typeследующее:

Content-Type: application/json

Создайте новый проект Spring Boot

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Как выполнить проверку параметров

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Вам нужно добавить статический, иначе 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 Аннотированный элемент должен быть нулевым
@NotNull Аннотированный элемент не должен быть нулевым
@AssertTrue Аннотированный элемент должен быть истинным
@AssertFalse Аннотированный элемент должен быть ложным
@Min(value) Аннотированный элемент должен быть числом, значение которого должно быть больше или равно указанному минимальному значению.
@Max(value) Аннотированный элемент должен быть числом, значение которого должно быть меньше или равно указанному максимальному значению.
@DecimalMin Аннотированный элемент должен быть числом, значение которого должно быть больше или равно указанному минимальному значению.
@DecimalMax Аннотированный элемент должен быть числом, значение которого должно быть меньше или равно указанному максимальному значению.
@Size(max=, min=) Размер аннотируемого элемента должен быть в пределах указанного диапазона.
@Digits Аннотируемый элемент должен быть числом, и его значение должно быть в допустимом диапазоне.
@Past Аннотированный элемент должен быть датой в прошлом
@Future Аннотированный элемент должен быть датой в будущем
@Pattern(regex=) Аннотированный элемент должен соответствовать указанному регулярному выражению.

Унифицированная обработка исключений

Выше описано, как разрешить Spring проверять наши параметры, тогда вы можете увидетьJSONСуществует длинный список результатов, возвращаемых проверкой метода, что не очень элегантно. Затем можно использовать унифицированную обработку исключений для элегантного возврата результата проверки параметра.

JSON方式: После сбоя проверки он броситMethodArgumentNotValidException

表单方式: проверка не проходит, выдаетConstraintViolationException

Следовательно, необходимо обрабатывать только эти два исключения в унифицированном классе обработки исключений.

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方式异常捕获

Полный код