Как SpringBoot элегантно проверяет параметры

Java

исходный адресисходный адрес

предисловие

Одна из раздражающих вещей в веб-разработке — это проверка параметров.По сути, каждый интерфейс должен проверять параметры.Например,необходима некоторая проверка формата и проверка ненулевого значения. Если параметров мало, то разобраться легко, но если параметров слишком много, то будет многоIF ELSEКак следующее:

В этом примере проверяются только пустые параметры. Если вам нужно проверить формат почтового ящика и проверку формата номера телефона, вы его представите.validatorПроверка параметров путем аннотации.

Что такое валидатор

Bean Validation — это набор спецификаций проверки данных на основе аннотаций, определенных Java.Он был обновлен с версии 1.0 JSR 303 до версии 1.1 JSR 349, а затем до версии 2.0 JSR 380 (версия 2.0 была завершена в 2017.08). . существуетSpringBootбыл интегрирован вstarter-web, поэтому нет необходимости добавлять другие зависимости.

Введение аннотации

встроенные аннотации валидатора

аннотация
Детали
@Null
Элементы должны быть аннотированыnull
@NotNull
Аннотируемый элемент не должен бытьnull
@AssertTrue
Аннотируемый элемент должен бытьtrue
@AssertFalse
Аннотируемый элемент должен бытьfalse
@Min(value)
Аннотируемый элемент должен быть числом, значение которого должно быть больше указанного минимума.
@Max(value)
Аннотированный элемент должен быть числом, значение которого должно быть меньше или равно указанному максимальному значению.
@DecimalMin(value)
Аннотируемый элемент должен быть числом, значение которого должно быть больше указанного минимума.
@DecimalMax(value)
Аннотированный элемент должен быть числом, значение которого должно быть меньше или равно указанному максимальному значению.
@Size(max, min)
Размер аннотируемого элемента должен быть в пределах указанного диапазона.
@Digits (integer, fraction) Аннотируемый элемент должен быть числом, и его значение должно быть в допустимом диапазоне.
@Past
Аннотированный элемент должен быть датой в прошлом
@Future
Аннотированный элемент должен быть датой в будущем
@Pattern(value)
Аннотированный элемент должен соответствовать указанному регулярному выражению.

Дополнительные ограничения Hibernate Validator

аннотация Детали
@Email
Аннотированный элемент должен быть адресом электронной почты.
@Length
Размер аннотированной строки должен быть в пределах указанного диапазона.
@NotEmpty
Аннотированная строка должна быть непустой.
@Range
Аннотируемый элемент должен находиться в соответствующей области
@NotBlank
Убедитесь, что строка не является нулевой, а ее длина должна быть больше 0.

Уведомление:

  • @NotNull применяется к аннотированному элементу любого типа, его нельзя использовать с NULL
  • @NotEmpty для String Map или array не может быть Null, а длина должна быть больше 0
  • @NotBlank может использоваться только для строки и не может быть нулевым.После вызова функции trim() длина должна быть больше 0.

использовать

Он также очень прост в использовании, и мы пропустим создание проекта ниже.

адрес на гитхабе:

Имитация регистрации пользователя инкапсулируетUserDTO

При отправке данных, если вы используете предыдущую практику,IF ELSEИспользование параметра сужденияvalidatorНеобходимо добавить аннотации.

Например, ненулевая проверка:

тогда нужноcontrollerДобавлено тело метода@Validatedне добавлять@Validatedпроверить не получится

Затем запросите интерфейс запроса и установите для параметра Email значение пустым.

параметр:

{
    "userName":"luomengsun",
    "mobileNo":"11111111111",
    "sex":1,
    "age":21,
    "email":""
}

Возвращаемый результат:

Исключение выбрасывается в фоновом режиме

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

добавить глобальное исключение

СоздаватьGlobalExceptionHandlerкласс, добавить над классом@RestControllerAdviceАннотируйте и добавьте следующий код:

    /**
     * 方法参数校验
     */
@ExceptionHandler(MethodArgumentNotValidException.class)
public ReturnVO handleMethodArgumentNotValidException(MethodArgumentNotValidException e) {
        log.error(e.getMessage(), e);
        return new ReturnVO().error(e.getBindingResult().getFieldError().getDefaultMessage());
    }

Этот метод захватывает в основномMethodArgumentNotValidExceptionЗатем исключение инкапсулирует аномальные результаты, и если вам нужно добавить другую обработку исключений самостоятельно.

После добавления смотрим на запущенный результат, вызывая интерфейс на возврат:

{
    "code": "9999",
    "desc": "邮箱不能为空",
    "data": null
}

OK Исключение обработано.

Проверить формат

Если вы хотите проверить формат электронной почты или номер мобильного телефона, это также очень просто.

Проверить почтовый ящик

    /**
     * 邮箱
     */
    @NotBlank(message = "邮箱不能为空")
    @NotNull(message = "邮箱不能为空")
    @Email(message = "邮箱格式错误")
    private String email;

Используйте номер телефона для обычной проверки

Подтвердите номер мобильного телефона, используя обычную проверку, а затем ограничьте количество цифр.

    /**
     * 手机号
     */
    @NotNull(message = "手机号不能为空")
    @NotBlank(message = "手机号不能为空")
    @Pattern(regexp ="^[1][3,4,5,6,7,8,9][0-9]{9}$", message = "手机号格式有误")
    @Max(value = 11,message = "手机号只能为{max}位")
    @Min(value = 11,message = "手机号只能为{min}位")
    private String mobileNo;

Проверьте результаты работы

Входящие параметры:

{
    "userName":"luomengsun",
    "mobileNo":"111111a",
    "sex":1,
    "age":21,
    "email":"1212121"
}

Возвращаемый результат:

{
    "code": "9999",
    "desc": "邮箱格式错误",
    "data": null
}

Вот пример того, что больше не проверяется номер мобильного телефона

пользовательская аннотация

Выше приведено не так много аннотаций, если есть специальные параметры проверки, которые мы можем использовать.ValidatorПользовательские аннотации для проверки

Сначала создайтеIdCardКласс аннотаций

@Documented
@Target({ElementType.PARAMETER, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = IdCardValidator.class)
public @interface IdCard {

    String message() default "身份证号码不合法";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};

}

Добавьте в UserDTO@IdCardАннотации можно проверять и запускать во время выполнения. В этой статье не слишком подробно рассказывается о пользовательских аннотациях. В следующей статье представлены пользовательские аннотации.

  • информация подсказки сообщения
  • группировка групп
  • Полезная нагрузка для Bean

затем добавьтеIdCardValidatorВ основном для логики проверки

вышеуказанный вызовis18ByteIdCardComplexМетод, передавая параметры, является номером телефона для подтверждения личности собственными правилами Baidu: см.noevil:

затем используйте

    @NotNull(message = "身份证号不能为空")
    @IdCard(message = "身份证不合法")
    private String IdCardNumber;

группировка

Например, мы бы пользовались определенными выше параметрами, если вы хотите взять, то как сделать?

Переопределить класс, а затем повторно аннотировать в нем параметры?

ValidatorПредоставляет метод группировки, который отлично решает проблему взятия DTO

Теперь изменим правила зарегистрированного интерфейса, только имя пользователя не может быть пустым, а остальные параметры не проверяются.

Сначала создайте сгруппированный интерфейс

public interface Create  extends Default {
}

Нам нужно только добавить аннотации, которые можно сгруппировать по таким параметрам, как:

  /**
     * 用户名
     */
    @NotBlank(message = "用户姓名不能为空",groups = Create.class)
    @NotNull(message = "用户姓名不能为空",groups = Create.class)
    private String userName;

    @NotBlank(message = "邮箱不能为空",groups = Update.class)
    @NotNull(message = "邮箱不能为空",groups = Update.class)
    @Email(message = "邮箱格式错误",groups = Update.class)
    private String email;

Затем измените контроллер в@ValidatedвходящийCreate.class

    @PostMapping("/user")
    public ReturnVO userRegistra(@RequestBody @Validated(Create.class) UserDTO userDTO){
        ReturnVO returnVO = userService.userRegistra(userDTO);
        return returnVO ;
    }

Затем вызов проходит в параметрах:

{
    "userName":"",
}

Возвращаемый параметр:

{
    "code": "9999",
    "desc": "用户姓名不能为空",
    "data": null
}

OK Теперь проверяется только Create, а группа Updata не проверяется.Если вам нужно повторно использовать DTO, вы можете использовать групповую проверку

Проверить один параметр

При разработке вы должны были столкнуться с одним параметром, и вы можете добавить комментарий перед параметром.

    @PostMapping("/get")
    public ReturnVO getUserInfo(@RequestParam("userId") @NotNull(message = "用户ID不能为空") String userId){
        return new ReturnVO().success();
    }

Затем добавьте его в класс Controller.@ValidatedПримечания, обратите внимание, что не увеличивается перед параметром.