Я не писал статьи почти полгода, и, наконец, я закончил работу, и я могу экспортировать ее во внешний мир. Некоторое время назад, отправляя обзор кода, коллега упомянул недостаток спецификации кода: проверка параметров должна быть размещена на уровне контроллера. Как должна быть выполнена проверка параметров?
Уровень контроллера VS сервисный уровень
Я пошел в Интернет, чтобы проверить некоторую информацию.Как правило, рекомендуется, чтобы те, которые не связаны с бизнесом, были проверены на уровне контроллера, а те, которые связаны с бизнесом, должны быть проверены на уровне обслуживания. Так как же элегантно и красиво написать проверку параметров?Если это все if-else, то чувствуется, что код написан очень низко.К счастью, есть колеса, которые можно использовать.
Часто используемые инструменты проверки
Использование Hibernate Validate
импортировать зависимости
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>4.3.1.Final</version>
</dependency>
Общие аннотации
аннотация | иллюстрировать |
---|---|
@Length(min=,max=) | Проверьте, находится ли длина принадлежащего поля между минимальной и максимальной, может использоваться только для строк |
@Range(min=,max=,message=) | Аннотируемый элемент должен находиться в соответствующей области |
@Max | Значение этого поля может быть меньше или равно этому значению. |
@Min | Значение этого поля может быть больше или равно этому значению. |
@NotNull | не может быть нулевым |
@NotBlank | Не может быть пустым, пробелы будут игнорироваться при проверке |
@NotEmpty | Не может быть пустым, пустой здесь относится к пустой строке |
@Pattern(regex=,flag=) | Аннотированный элемент должен соответствовать указанному регулярному выражению. |
использовать позу
Его нужно использовать с аннотациями @Validated или @Valid в контроллере.Разница между аннотациями @Validated и @Valid не очень большая.В общем случае можно выбрать одну из них.Разница в следующем:
аннотация | @Validated | @Valid |
---|---|---|
принадлежащий пакет | Он принадлежит пакету org.springframework.validation.annotation и предоставляется Spring | Он принадлежит пакету javax.validation и предоставляется jdk. |
Поддерживать ли группировку и сортировку | да | нет |
Хотя @Validated является более мощным, чем @Valid, он предоставляет функции группировки и сортировки проверки поверх @Valid, но он не использовался в реальных проектах.
Аннотации в структуре Hibernate-validate необходимо добавить к объекту и использовать вместе.
- определить объект
public class DataSetSaveVO {
//唯一标识符为空
@NotBlank(message = "user uuid is empty")
//用户名称只能是字母和数字
@Pattern(regexp = "^[a-z0-9]+$", message = "user names can only be alphabetic and numeric")
@Length(max = 48, message = "user uuid length over 48 byte")
private String userUuid;
//数据集名称只能是字母和数字
@Pattern(regexp = "^[A-Za-z0-9]+$", message = "data set names can only be letters and Numbers")
//文件名称过长
@Length(max = 48, message = "file name too long")
//文件名称为空
@NotBlank(message = "file name is empty")
private String name;
//数据集描述最多为256字节
@Length(max = 256, message = "data set description length over 256 byte")
//数据集描述为空
@NotBlank(message = "data set description is null")
private String description;
}
Описание: Поле сообщения представляет собой информацию об исключении, выдаваемую, когда оно не соответствует правилам проверки.
- Методы на уровне контроллера
@PostMapping
public ResponseVO createDataSet(@Valid @RequestBody DataSetSaveVO dataSetVO) {
return ResponseUtil.success(dataSetService.saveDataSet(dataSetVO));
}
Описание: добавьте аннотацию @Valid или @Validated рядом с проверенным объектом DataSetSaveVO.
Используйте commons-lang3
импортировать зависимости
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.4</version>
</dependency>
Описание распространенных методов
метод | иллюстрировать |
---|---|
CollectionUtils.isEmpty | Определить, является ли коллекция пустой, нулевой или size==0, вернуть true |
CollectionUtils.isNotEmpty | Проверить, не пуста ли коллекция |
StringUtils.isEmpty | Проверить, пуста ли строка |
StringUtils.isNotEmpty | Проверить, не пуста ли строка |
StringUtils.isBlank | Определить, является ли строка пустой, нулевой или size==0 или только символами пробела (такими как " "), вернуть true |
StringUtils.isNotBlank | Проверить, не пуста ли строка |
- тестовый код
//StringUtils.isEmpty
System.out.println(StringUtils.isEmpty("")); //true
System.out.println(StringUtils.isEmpty(" ")); //false
//StringUtils.isNotEmpty
System.out.println(StringUtils.isNotEmpty("")); //false
//StringUtils.isBlank
System.out.println(StringUtils.isBlank("")); //true
System.out.println(StringUtils.isBlank(" ")); //true
//StringUtils.isNotBlank
System.out.println(StringUtils.isNotBlank(" ")); //false
List<Integer> emptyList = new ArrayList<>();
List<Integer> nullList = null;
List<Integer> notEmptyList = new ArrayList<>();
notEmptyList.add(1);
//CollectionUtils.isEmpty
System.out.println(CollectionUtils.isEmpty(emptyList)); //true
System.out.println(CollectionUtils.isEmpty(nullList)); //true
System.out.println(CollectionUtils.isEmpty(notEmptyList)); //false
//CollectionUtils.isNotEmpty
System.out.println(CollectionUtils.isNotEmpty(emptyList)); //false
System.out.println(CollectionUtils.isNotEmpty(nullList)); //false
System.out.println(CollectionUtils.isNotEmpty(notEmptyList)); //true
пользовательская аннотация
Когда вышеуказанные аспекты не могут соответствовать требованиям проверки, вы можете рассмотреть возможность использования пользовательских аннотаций.Как написать индивидуальную аннотацию, вы можете обратиться к предыдущей статье:Пользовательские аннотации Spring от входа до мастерства