web-dev-qa-db-ja.com

Hibernate Validator 4.1+では、@ NotNull、@ NotEmpty、および@NotBlankの違いは何ですか?

これら3つの注釈の違いを区別する要約を見つけることができないようです。

107
Rick Hanlon II

@NotNull:CharSequence、Collection、Map、またはArrayオブジェクトnullではないですが、canは空にできます。
@NotEmpty:CharSequence、Collection、Map、またはArrayオブジェクトはnullではありませんおよびサイズ>
@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制約を使用しますand@Sizeオブジェクトですが、自明であるべきです。

  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定義も@NotNullが必要です。

以下に例を示します。

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

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

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

  4. 文字列名= "グレートアンサー!";
    @NotNulltrue
    @NotEmptytrue
    @NotBlanktrue

297
Rick Hanlon II

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

@NotNull:コンテンツを無視して、値がnullでないかどうかを確認します

@NotEmpty:値がnullでも空でもないかどうかを確認します。空のスペースだけがある場合は、空でないことを許可します。

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

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

7
Pratiksha
  1. @NotNull:制約されたCharSequence、Collection、Map、またはArrayは、nullでない限り有効ですが、空にすることができます
  2. @NotEmpty:制約されたCharSequence、Collection、Map、またはArrayは、nullでなく、サイズ/長さがゼロより大きい限り有効です。
  3. @NotBlank: nullではなく、トリミングされた長さがゼロより大きい限り、制約された文字列は有効です。
1