124

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

4

3 に答える 3

339

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

理解を助けるために、これらの制約がどのように定義され、実行されるかを見てみましょう (私はバージョン 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その定義はオブジェクトに基づいて異なりますが、一目瞭然です。

  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: 偽
    @NotEmpty: 偽
    @NotBlank: 偽

  2. 文字列名 = "";
    @NotNull:
    @NotEmpty: 偽
    @NotBlank: 偽

  3. 文字列名 = " ";
    @NotNull:
    @NotEmpty:
    @NotBlank: 偽

  4. String name = "正解です!";
    @NotNull:
    @NotEmpty:
    @NotBlank:

于 2013-06-16T20:18:23.150 に答える