これら3つの注釈の違いを区別する要約を見つけることができないようです。
@NotNull
:CharSequence、Collection、Map、またはArrayオブジェクトnullではないですが、canは空にできます。@NotEmpty
:CharSequence、Collection、Map、またはArrayオブジェクトはnullではありませんおよびサイズ>。@NotBlank
:文字列がnullではありませんおよびトリミングされた長さがゼロより大きい。
理解を助けるために、これらの制約がどのように定義され実行されるかを見てみましょう(バージョン4.1を使用しています)。
@NotNull
制約は次のように定義されます:
@Constraint(validatedBy = {NotNullValidator.class})
このクラスには、次のように定義されたisValid
メソッドがあります。
public boolean isValid(Object object, ConstraintValidatorContext constraintValidatorContext) {
return object != null;
}
@NotEmpty
制約は次のように定義されます:
@NotNull
@Size(min = 1)
したがって、この制約は、上記の@NotNull
制約を使用します、and@Size
オブジェクトですが、自明であるべきです。
最後に、@NotBlank
制約は次のように定義されます。
@NotNull
@Constraint(validatedBy = {NotBlankValidator.class})
したがって、この制約は@NotNull
制約も使用しますが、NotBlankValidatorクラスを使用して制約も行います。このクラスには、次のように定義されたisValid
メソッドがあります。
if ( charSequence == null ) { //curious
return true;
}
return charSequence.toString().trim().length() > 0;
興味深いことに、このメソッドは文字列がnullの場合trueを返しますが、トリミングされた文字列の長さが0の場合のみfalseを返します。前述のように@NotEmpty
定義も@NotNull
が必要です。
以下に例を示します。
文字列名= null;@NotNull
:false@NotEmpty
:false@NotBlank
:false
文字列名= "";@NotNull
:true@NotEmpty
:false@NotBlank
:false
文字列名= "";@NotNull
:true@NotEmpty
:true@NotBlank
:false
文字列名= "グレートアンサー!";@NotNull
:true@NotEmpty
:true@NotBlank
:true
以下のリンクの説明が気に入りました: http://www.itprogrammingtutorials.com/2015/Java/hibernate/hibernate-validator-diff-notblank-notempty/
@NotNull:コンテンツを無視して、値がnullでないかどうかを確認します
@NotEmpty:値がnullでも空でもないかどうかを確認します。空のスペースだけがある場合は、空でないことを許可します。
@NotBlank:値がnullでも空でもないかどうかを確認し、最初に値をトリミングします。つまり、空のスペースだけを許可するわけではありません。
したがって、フィールドがnullではなく、空のスペースだけでなくテキストでもないことを検証する場合は、@ NotBlankを使用する必要があります。
@NotNull:
制約されたCharSequence、Collection、Map、またはArrayは、nullでない限り有効ですが、空にすることができます@NotEmpty:
制約されたCharSequence、Collection、Map、またはArrayは、nullでなく、サイズ/長さがゼロより大きい限り有効です。@NotBlank:
nullではなく、トリミングされた長さがゼロより大きい限り、制約された文字列は有効です。