предисловие
Текст был включен в мой репозиторий 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] Если в этом блоге есть ошибки, прошу покритиковать и посоветовать, буду очень признателен!