Унифицированная обработка исключений 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 шага могут завершить проверку параметров:
можно увидеть, как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
Попробуй пусто: