предисловие
В ежедневном развитиипроверка параметровЭто очень важная ссылка, строгая проверка параметров снизит вероятность многих ошибок и повысит безопасность интерфейса. Это также сократит количество ненужных сообщений во время стыковки. Например: при стыковке фронтенд сделает скриншот и скажет, что проблема с интерфейсом.Подолго проверяя, вы обнаружите, что проблема с переданными фронтендом параметрами. Для вышеперечисленного: поделиться с вами сегодняSpringBootКак реализовать унифицированную проверку параметров.
Метод реализации
использовать@Validated
Аннотация работает с аннотациями проверки параметров, например:@NotEmpty
Проверьте параметры. Затем для выброшенного исключенияControllerAdvice
Сделайте снимок, а затем настройте выходные данные.
TestController
@RestController
public class TestController {
/**
* 表单请求
* @param form 请求参数
* @return 响应数据
*/
@PostMapping("/formRequest")
public ResultVo formRequest(@Validated RequestForm form){
return ResultVoUtil.success(form);
}
/**
* JSON请求
* @param form 请求参数
* @return 响应数据
*/
@PostMapping("/jsonRequest")
public ResultVo jsonRequest(@RequestBody @Validated RequestForm form){
return ResultVoUtil.success(form);
}
}
RequestForm
@Data
public class RequestForm {
@NotEmpty(message = "姓名不能为空")
private String name;
@Min(value = 1 , message = "年龄不能小于1岁")
private Integer age;
@NotEmpty(message = "性别不能为空")
private Integer sex;
}
Результаты теста
Запрос: http://localhost:8080/formRequest без каких-либо параметров.
На данный момент SpringBoot проверил параметры в соответствии с проверочной аннотацией. И выводить много сообщений об ошибках. В это время передняя часть видит такое сообщение об ошибке при стыковке, а обратная сторона - сделать скриншот, чтобы сообщить вам, что есть проблема с интерфейсом. Так что на этот раз вы должны использоватьControllerAdvice
Каноническое исключение возвращает информацию.
ControllerAdvice
@Slf4j
@RestControllerAdvice
public class ControllerAdvice {
/**
* 拦截表单参数校验
*/
@ResponseStatus(HttpStatus.OK)
@ExceptionHandler({BindException.class})
public ResultVo bindException(BindException e) {
BindingResult bindingResult = e.getBindingResult();
return ResultVoUtil.error(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage());
}
/**
* 拦截JSON参数校验
*/
@ResponseStatus(HttpStatus.OK)
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResultVo bindException(MethodArgumentNotValidException e) {
BindingResult bindingResult = e.getBindingResult();
return ResultVoUtil.error(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage());
}
}
@RestControllerAdvice выведет возвращаемые данные в виде json, если вам это не нужно, вы можете использовать @ControllerAdvice
Приведенный выше код возвращает только сообщение об ошибке. Его можно отрегулировать в соответствии с реальной ситуацией.
В настоящее время сообщение об ошибке более понятное, и совершенно ясно, что параметр отсутствует.
Общие примечания по проверке
аннотация | проверки во время выполнения |
---|---|
@AssertFalse | Аннотированный элемент должен быть ложным |
@AssertTrue | Аннотированный элемент должен быть истинным |
@DecimalMax(value) | Аннотируемый элемент должен быть числом, а его значение должно быть меньше или равно указанному минимальному значению. |
@DecimalMin(Value) | Аннотируемый элемент должен быть числом, а его значение должно быть больше или равно указанному минимальному значению. |
@Digits(integer=, fraction=) | Аннотируемый элемент должен быть числом, и его значение должно быть в допустимом диапазоне. |
@Future | Аннотированный элемент должен быть датой, проверьте, не является ли данная дата более поздней, чем сейчас. |
@Max(value) | Аннотируемый элемент должен быть числом, а его значение должно быть меньше или равно указанному минимальному значению. |
@Min(value) | Аннотируемый элемент должен быть числом, а его значение должно быть больше или равно указанному минимальному значению. |
@NotNull | Аннотированный элемент не должен быть нулевым |
@Null | Аннотированный элемент должен быть нулевым |
@Past(java.util.Date/Calendar) | Дата, к которой аннотируемый элемент должна быть в прошлом, убедитесь, что значение в объекте аннотации представляет собой более раннюю дату, чем текущая. |
@Pattern(regex=, flag=) | Аннотированный элемент должен соответствовать регулярному выражению, проверьте, может ли строка соответствовать регулярному выражению, определенному regex, в случае, указанном match |
@Size(min=, max=) | Аннотируемый элемент должен находиться в указанном диапазоне (типы данных: строка, коллекция, карта и массивы). |
@Valid | Рекурсивно проверьте связанный объект. Если связанный объект является коллекцией или массивом, рекурсивно проверьте элементы в нем. Если это карта, проверьте часть значения. |
@CreditCardNumber | Выполните грубую проверку номера кредитной карты |
Аннотированный элемент должен быть адресом электронной почты. | |
@Length(min=, max=) | Аннотированный объект должен быть строкой, а его размер должен находиться в указанном диапазоне. |
@NotBlank | Аннотируемый объект должен быть строкой, а не пустой, пробелы будут игнорироваться при проверке |
@NotEmpty | Аннотированный объект должен быть пустым (данные: строка, коллекция, карта, массивы) |
@Range(min=, max=) | Аннотированный элемент должен находиться в соответствующем диапазоне (данные: BigDecimal, BigInteger, String, byte, short, int, long и классы-оболочки для примитивных типов) |
@URL(protocol=, host=, port=, regexp=, flags=) | Аннотированный объект должен быть строкой, проверьте, является ли он допустимым URL-адресом, если указаны протокол, хост и т. д., URL-адрес также должен соответствовать предоставленным условиям. |
кейс
@Data
public class ExampleForm {
@NotEmpty(message = "姓名不能为空")
@Length(min = 1 , max = 10 , message = "名字长度1~10")
private String name;
@Range(min = 1 , max = 99 , message = "年龄范围在1~99岁")
private Integer age;
@Pattern(regexp = "^[1][3,4,5,7,8][0-9]{9}$" , message = "电话号码有误")
private String phone;
@Email(message = "邮箱格式有误")
private String email;
@Valid
@Size(min = 1 ,max = 10 , message = "列表中的元素数量为1~10")
private List<RequestForm> requestFormList;
@Future(message = "开始时间必须大于当前时间")
private Date beginTime;
}
Реализовать вложенную проверку
В реальной разработке передний план будет передавать список фону.Нам нужно не только ограничить количество каждого запроса в списке, но и проверить значения атрибутов базовых элементов в списке. В настоящее время требуется вложенная проверка, и реализация очень проста. Добавление @Vaild в список поможет.
@Data
public class JsonRequestForm {
@Vaild
@Size(min = 1 ,max = 10 , message = "列表中的元素数量为1~10")
private List<RequestForm> requestFormList;
}
кодовый адрес
https://gitee.com/huangxunhui/unifiedParamCheck.git
конец
Если вы считаете, что это полезно для вас, вы можете прокомментировать и поставить лайк, или вы можете перейти на мою домашнюю страницу, чтобы увидеть, может быть, есть статья, которая вам нравится, вы также можете просто подписаться на нее, спасибо.