我似乎找不到能够区分这三个注释之间区别的摘要。
@NotNull:CharSequence,Collection,Map或Array对象 不为null ,但 可以 为空。 @NotEmpty:CharSequence,Collection,Map或Array对象不为null, 并且size > 0。 @NotBlank:字符串不为null ,并且修剪后的长度大于零 。
@NotNull
@NotEmpty
@NotBlank
为了帮助您理解,让我们研究一下如何定义和执行这些约束(我使用的是4.1版):
@Constraint(validatedBy = {NotNullValidator.class})
此类的isValid方法定义为:
isValid
public boolean isValid(Object object, ConstraintValidatorContext constraintValidatorContext) { return object != null; }
@Size(min = 1)
因此,此约束 使用@NotNull上面的约束, 并且 @Size其定义因对象而异,但应该是自说明的。
@Size
@Constraint(validatedBy = {NotBlankValidator.class})
因此,此约束还使用了@NotNull约束,但也约束了NotBlankValidator类。此类的isValid方法定义为:
if ( charSequence == null ) { //curious return true; } return charSequence.toString().trim().length() > 0;
有趣的是,如果字符串为null,则此方法返回true,但仅当修剪后的字符串的长度为0时,此方法才返回false。如果为null,则返回true是可以的,因为正如我提到的,@NotEmpty定义也需要@NotNull。
这里有一些例子:
字符串名称= null; @NotNull:错误 @NotEmpty:错误 @NotBlank:错误
字符串名称=“”; @NotNull: 真 @NotEmpty:假 @NotBlank:假
字符串名称=“”; @NotNull: true @NotEmpty: true @NotBlank:false
字符串名称=“好答案!”; @NotNull: true @NotEmpty: true @NotBlank: true