В 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.