В Hibernate Validator 4.1+, в чем разница между @NotNull, @NotEmpty и @NotBlank?
Я не могу найти резюме, которое отличает разницу между этими тремя аннотациями.
2 ответа:
@NotNull: CharSequence, коллекция, карта или массив объекта не null, а можете быть пустым.@NotEmpty: объект CharSequence, Collection, Map или Array не является нулевым и размер > 0.@NotBlank: строка не null и обрезанная длина больше нуля.чтобы помочь вам понять, давайте посмотрим, как эти ограничения определяются и выполняются (я использую версию 4.1):
The
@NotNullограничение определено как:@Constraint(validatedBy = {NotNullValidator.class})этот класс имеет
isValidметод определен как:public boolean isValid(Object object, ConstraintValidatorContext constraintValidatorContext) { return object != null; }The
@NotEmptyограничение определено как:@NotNull @Size(min = 1)так это ограничение использует the
@NotNullограничение выше, и@Sizeчье определение отличается в зависимости от объекта, но должно быть самоочевидным.наконец,
@NotBlankограничение определено как:@NotNull @Constraint(validatedBy = {NotBlankValidator.class})так что это ограничение также использует
@NotNullограничение, но также ограничивает класс NotBlankValidator. Этот класс имеетisValidметод определен как:if ( charSequence == null ) { //curious return true; } return charSequence.toString().trim().length() > 0;интересно, что этот метод возвращает true, если строка имеет значение null, но false, если и только если длина обрезанной строки равна 0. Это нормально, что он возвращает true, если он равен null, потому что, как я упоминалось, что
@NotEmptyопределение также требует@NotNull.вот несколько примеров:
String name = null;
@NotNull: false@NotEmpty: нет@NotBlank: falseString name = "";
@NotNull:правда@NotEmpty: нет@NotBlank: falseString name = " ";
@NotNull: правда@NotEmpty:правда@NotBlank: falseString name = " отличный ответ!";
@NotNull:правда@NotEmpty:правда@NotBlank:правда
Мне понравилось объяснение в ссылке ниже: http://www.itprogrammingtutorials.com/2015/java/hibernate/hibernate-validator-diff-notblank-notempty/
@NotNull: проверяет, не является ли значение null, игнорируя содержимое
@NotEmpty: проверяет, не является ли значение null или пустым. Если у него есть только пустые места, он позволит ему не быть пустым.
@NotBlank: проверяет, не является ли значение null или пустым, сначала обрезая значение. Это означает, что он не позволит просто пустые пространства.
Итак, если вы хотите проверить, что поле не является нулевым, но и что оно имеет не только пустые пробелы, но и текст, вы должны использовать @NotBlank.