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