Spring Boot использует проверку для проверки параметров

Java

предисловие

Текст был включен в мой репозиторий GitHub, добро пожаловать в Star: https://github.com/bin392328206/six-finger
Лучшее время посадить дерево было десять лет назад, затем сейчас
Я знаю, что многие люди не играютqqДа, но с ностальгией, добро пожаловать в группу изучения Java для новичков Six Meridians Excalibur, номер группового чата:549684836Поощряйте всех вести блог на пути к технологиям

болтовня

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

Введение в JSR-303

JSR-303 — это подспецификация JavaEE 6, которая называется Bean Validation, а официальной эталонной реализацией является Hibernate Validator. Эта реализация не имеет ничего общего с Hibernate ORM. JSR-303 используется для проверки значения поля в Java Bean. Spring MVC 3.x также сильно поддерживает JSR-303, который может легко проверять данные, отправленные формой, с помощью аннотаций в контроллере. Spring 4.0 начал поддерживать функцию проверки компонентов. JSR-303 Основные правила проверки

Пустой чек

  • @Null проверяет, является ли объект нулевым
  • @NotNull проверяет, что объект не является нулевым, не может проверить строку длины 0
  • @NotBlank Проверьте, является ли строка ограничения нулевой и превышает ли длина Trim 0, только для строк, и удалит начальные и конечные пробелы.
  • @NotEmpty проверяет, является ли элемент ограничения NULL или EMPTY

логическая проверка

  • @AssertTrue проверяет, является ли логический объект истинным
  • @AssertFalse проверяет, является ли логический объект ложным.

проверка длины

@Size(min=, max=) Убедитесь, что длина объекта (массив, коллекция, карта, строка) находится в заданном диапазоне @Length(min=, max=) Убедитесь, что длина строки находится между min и max

проверка даты

  • @Past проверяет, что объекты даты и календаря предшествуют текущему времени. Если проверка верна, аннотированный элемент должен быть датой в прошлом
  • @Future проверяет, что объекты даты и календаря после текущего времени.Если проверка верна, аннотированный элемент должен быть датой в будущем

проверка регулярных выражений

@Pattern проверяет, соответствует ли объект String правилам регулярного выражения, а аннотированный элемент соответствует указанному регулярному выражению. - регулярное выражение: регулярное выражение - флаги: укажите массив Pattern.Flag, представляющий параметры, связанные с регулярными выражениями.

Численная проверка

Примечание. Рекомендуется использовать типы String и Integer, но не типы int, потому что значение формы не может быть преобразовано в int, когда значение равно "", но может быть преобразовано в String как "", а Integer имеет значение null.

  • @Min проверяет, что объекты Number и String больше или равны указанному значению.
  • @Max проверяет, что объекты Number и String меньше или равны указанному значению.
  • Значение, аннотированное с помощью @DecimalMax, не должно превышать максимальное значение, указанное в ограничении. Аргументом этого ограничения является строковое представление максимального значения, определенного BigDecimal. Десятичные числа имеют точность
  • Значение, аннотированное с помощью @DecimalMin, не должно быть меньше минимального значения, указанного в ограничении. Параметр этого ограничения представляет собой строковое представление минимального значения, определенного BigDecimal. Десятичное число имеет точность
  • @Digits проверяет правильность сочетания числа и строки.
  • @Digits(integer=,fraction=) Убедитесь, что строка представляет собой число, соответствующее указанному формату, целое число указывает целочисленную точность, дробь указывает десятичную точность
  • @Range(min=, max=) Указанный элемент должен находиться в соответствующем диапазоне
  • @Range(min=10000,max=50000,message=”range.bean.wage”)
  • @Valid рекурсивно проверяет связанный объект. Если связанный объект является коллекцией или массивом, рекурсивно проверяет его элементы. Если это карта, проверяет часть значения (независимо от того, выполняется ли рекурсивная проверка)
  • @CreditCardNumber Подтверждение кредитной карты
  • @Email проверяет, является ли это адресом электронной почты, если он нулевой, проверка не выполняется и проверка пройдена.
  • @ScriptAssert(lang= ,script=, alias=)
  • @URL(protocol=,host=, port=,regexp=, flags=)

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

Что касается использования, Xiaoliuliu не будет приводить примеры один за другим. Я считаю, что это должен знать каждый. Может быть, я не разбираюсь в деталях, поэтому на этот раз я дам вам хороший обзор, ха-ха.

@Data
public class User {
 
 /** id */
 @NotNull(message="id不能为空")
 private Long id;
 
 /** 姓名 */
 @NotBlank(message="姓名不能为空")
 private String name;
 
 /** 年龄 */
 @NotNull(message="年龄不能为空")
 @Max(message="年龄不能超过120岁", value = 120)
 @Min(message="年龄不能小于1岁", value = 1)
 private Integer age;
 
 /** 创建时间 */
 @Future
 private Date createTime;
}
 

Затем на уровне контроллера просто используйте @Valid

 /**
  * 校验不通过时直接抛异常
  * @param user
  * @return
  */
 @PostMapping("/test1")
 public Object test1(@RequestBody @Valid User user) {
  return "操作成功!";
 }

3 способа выполнить проверку в Spring Validation

Первый: добавьте аннотацию @Valid перед параметром метода Controller — выбрасывайте исключение сразу, когда проверка не пройдена.

При вызове возникает исключение org.springframework.web.bind.MethodArgumentNotValidException:

2019-04-21 11:35:28.600  WARN 10852 --- [nio-8080-exec-4] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.bind.MethodArgumentNotValidException: Validation failed for argument [0] in public java.lang.Object com.example.validation.UserController.test1(com.example.validation.User) with 3 errors: [Field error in object 'user' on field 'createTime': rejected value [Mon Dec 31 08:00:00 CST 2018]; codes [Future.user.createTime,Future.createTime,Future.java.util.Date,Future]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [user.createTime,createTime]; arguments []; default message [createTime]]; default message [需要是一个将来的时间]] [Field error in object 'user' on field 'age': rejected value [0]; codes [Min.user.age,Min.age,Min.java.lang.Integer,Min]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [user.age,age]; arguments []; default message [age],1]; default message [年龄不能小于1岁]] [Field error in object 'user' on field 'name': rejected value []; codes [NotBlank.user.name,NotBlank.name,NotBlank.java.lang.String,NotBlank]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [user.name,name]; arguments []; default message [name]]; default message [姓名不能为空]] ]

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

Второй: добавить аннотацию @Valid перед параметром метода контроллера, а после параметра определить параметр типа BindingResult — результат проверки будет помещаться в bindingResult во время выполнения, и пользователь может сам его судить и обрабатывать.

   /**
  * 将校验结果放进BindingResult里面,用户自行判断并处理
  * @param user
  * @param bindingResult
  * @return
  */
 @PostMapping("/test2")
 public Object test2(@RequestBody @Valid User user, BindingResult bindingResult) {
  // 参数校验
  if (bindingResult.hasErrors()) {
   String messages = bindingResult.getAllErrors()
    .stream()
    .map(ObjectError::getDefaultMessage)
    .reduce((m1, m2) -> m1 + ";" + m2)
    .orElse("参数输入有误!");
   throw new IllegalArgumentException(messages);
  }
  
  return "操作成功!";

Инкапсулировать результат в BindingResult, а затем инкапсулировать информацию, которая будет выбрасываться самостоятельно.Такой подход также возможен, то есть каждый контроллер должен его записать, что не так применимо, рекомендуемый индекс 2 звезды

Третий тип: пользователь вручную вызывает соответствующий API для выполнения проверки — Validation.buildDefault ValidatorFactory().getValidator().validate(xxx)

   /**
  * 用户手动调用对应API执行校验
  * @param user
  * @return
  */
 @PostMapping("/test3")
 public Object test3(@RequestBody User user) {
  // 参数校验
  validate(user);
  
  return "操作成功!";
 }
 
 private void validate(@Valid User user) {
  Set<ConstraintViolation<@Valid User>> validateSet = Validation.buildDefaultValidatorFactory()
    .getValidator()
    .validate(user, new Class[0]);
   if (!CollectionUtils.isEmpty(validateSet)) {
    String messages = validateSet.stream()
     .map(ConstraintViolation::getMessage)
     .reduce((m1, m2) -> m1 + ";" + m2)
     .orElse("参数输入有误!");
    throw new IllegalArgumentException(messages);
    
   }
}

Это на самом деле тот же принцип, но выглядит так же, не так элегантно, индекс рекомендации 2 звезды

конец

На самом деле принципы этих трех употреблений одинаковы, но форма употребления разная.Вообще-то решать вам, ха-ха.

Ссылаться на

ежедневные комплименты

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

Творить нелегко. Ваша поддержка и признание — самая большая мотивация для моего творчества. Увидимся в следующей статье.

Six Meridians Excalibur | Text [Original] Если в этом блоге есть ошибки, прошу покритиковать и посоветовать, буду очень признателен!