Унифицированная проверка параметров SpringBoot

Java

предисловие

  В ежедневном развитиипроверка параметровЭто очень важная ссылка, строгая проверка параметров снизит вероятность многих ошибок и повысит безопасность интерфейса. Это также сократит количество ненужных сообщений во время стыковки. Например: при стыковке фронтенд сделает скриншот и скажет, что проблема с интерфейсом.Подолго проверяя, вы обнаружите, что проблема с переданными фронтендом параметрами. Для вышеперечисленного: поделиться с вами сегодня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Каноническое исключение возвращает информацию.

image
image

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

Приведенный выше код возвращает только сообщение об ошибке. Его можно отрегулировать в соответствии с реальной ситуацией.

image
image

В настоящее время сообщение об ошибке более понятное, и совершенно ясно, что параметр отсутствует.

Общие примечания по проверке

аннотация проверки во время выполнения
@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 Выполните грубую проверку номера кредитной карты
@Email Аннотированный элемент должен быть адресом электронной почты.
@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

конец

  Если вы считаете, что это полезно для вас, вы можете прокомментировать и поставить лайк, или вы можете перейти на мою домашнюю страницу, чтобы увидеть, может быть, есть статья, которая вам нравится, вы также можете просто подписаться на нее, спасибо.