Hibernate Validator 4.1以降では、@ NotNull、@ NotEmpty、@ NotBlankの違いは何ですか?


回答:


314

@NotNull:CharSequence、Collection、Map、またはArrayオブジェクトはnullはありません、空にすることができます。
@NotEmpty:CharSequence、Collection、Map、またはArrayオブジェクトはnullではなく、サイズ> 0です。
@NotBlank:文字列はnullではなく、トリミングされた長さはゼロより大きいです

理解を助けるために、これらの制約がどのように定義され、実行されるかを見てみましょう(私はバージョン4.1を使用しています):

  1. @NotNull制約は次のように定義されています。

    @Constraint(validatedBy = {NotNullValidator.class})  

    このクラスには、isValid次のように定義されたメソッドがあります。

    public boolean isValid(Object object, ConstraintValidatorContext constraintValidatorContext) {
     return object != null;  
    }
  2. @NotEmpty制約は次のように定義されています。

    @NotNull  
    @Size(min = 1)    

    だから、この制約は使用@NotNull上の制約、および @Sizeその定義が異なったオブジェクトに基づいていますが、自己explanitoryでなければなりませんが。

  3. 最後に、@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定義でもが必要なため、nullの場合はtrueを返します@NotNull

以下にいくつかの例を示します。

  1. 文字列名= null;
    @NotNull:false
    @NotEmpty:false
    @NotBlank:false

  2. 文字列名= "";
    @NotNulltrue
    @NotEmpty:false
    @NotBlank:false

  3. 文字列名= "";
    @NotNulltrue
    @NotEmptytrue
    @NotBlank:false

  4. 文字列名= "すばらしい答え!";
    @NotNulltrue
    @NotEmptytrue
    @NotBlanktrue


29
私はこの情報を自分で追跡するのに少し時間を費やしましたが、他の人がその努力から利益を得られるようにしたいと思っていました。「明確にするために、あなた自身の質問をして答えるだけでは問題ありません、それは明確に奨励されます。」blog.stackoverflow.com/2011/07/...
リック・ハンロンII

4
私の意見では、@ NotBlankはnullを受け入れる必要があります。空白が単に無効であるオプションのフィールドにnullを受け入れる場合があります。
tbraun 2016年

1
私はそれに同意します。nullでも空でもない場合は、両方を使用できます。それはそうではないので、あなたはあなた自身のバリデーターを書いて、あなたが期待するようにそれを使うことができました。
Rick Hanlon II

1
注:@NotNullは、「CharSequence、Collection、Map、またはArray」だけでなく、任意のオブジェクトで使用できます。実際、ポイント1で挿入したコードが示すとおりです。
ニコロ・

@RickHanlonII Hibernate Validator 5+でそれがどのように検証されるかを提案できますか?ConstraintValidatorこれらのアノテーションに関連するものはもうないようです。
Steve

7

以下のリンクの説明が気に入りました:http : //www.itprogrammingtutorials.com/2015/java/hibernate/hibernate-validator-diff-notblank-notempty/

@NotNull:内容を無視して、値がnullでないかどうかをチェックします

@NotEmpty:値がnullでも空でもないかどうかをチェックします。空のスペースしかない場合は、空でないことを許可します。

@NotBlank:値がnullでも空でもないかどうかをチェックし、最初に値をトリミングします。つまり、空のスペースだけを許可するわけではありません。

したがって、フィールドがnullではなく、空のスペースだけではなくテキストであることを検証する場合は、@ NotBlankを使用する必要があります。


1
  1. @NotNull: 制約されたCharSequence、Collection、Map、またはArrayは、nullでない限り有効ですが、空でもかまいません
  2. @NotEmpty: 制約されたCharSequence、Collection、Map、またはArrayは、nullでなく、サイズ/長さがゼロより大きい限り有効です。
  3. @NotBlank: 制約された文字列は、それがnullでなく、トリムされた長さがゼロより大きい限り有効です。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.