什么是约束点验证@Null?

时间:2017-06-21 18:09:03

标签: java-ee constraints bean-validation

我正在检查javax.validation包中的list of available constraints,我注意到有一个注释@Null会强制该字段为空。

如果我已经知道它应该为空,我不明白将它添加到我的字段有什么意义。

例如,看看这个类:

public class MyClass{

    @NotNull
    private String myString1;

    @Null
    private String myString2;

    // getter setters...
}

@NotNull完全有道理。我不希望myString1为空。但@Null使myString2无用。有一个字段应该始终为空是什么意义。

3 个答案:

答案 0 :(得分:4)

仅在某些情况下,您可能需要结合使用@Null和“验证组”来验证null约束。

Good explanation and example on validation groups provided by Hibernate

您将定义验证组为简单界面

public interface FirstSave {}

然后在约束中使用它

public class MyClass {

    @Null(groups = FirstSave.class)
    private LocalDate lastUpdate;
}

然后如果lastUpdate 不是 null,则调用validator.validate(myClassInstance) 不会会产生约束冲突(使用了默认组),但会打validator.validate(myClassInstance, FirstSave.class)

您还可以提供有关如何使用注释的自己的实现,即,我看到验证方法用@Null进行了注释,其中方法返回的null意味着一切都很好。在后台,如果带注释的方法返回的结果不是null,该怎么做可能是自定义实现,但是我没有深入研究代码...

答案 1 :(得分:1)

@Null 是提供的非常重要的注释。 它不是无用的。 让我展示一个常见的用例。 说,有道对象(实体)对象 id 自动生成。 如果你想对 Dto 和 Dao 使用单个 ckass

现在, @GetMapping 返回没有问题的 dtos 列表 @PosrMapping 添加新元素需要输入 Dto 不得包含 id 字段,即使存在,它也必须为空或未定义。 这样的输入 jspmon 当转换为 Dto object 时,期望 ud 必须为空。 为此,@Null 是唯一的选择

@PutMapping 期望 id 必须为空,因此当我们期望更新发生在一个 dingle 对象上时,id 字段需要 @NotNull

@DeleteMapping 只需要整数字段 Id ,仅当我们想删除具有已知 id 的对象时。

还有其他复杂的情况,通常不处理但有意义

@GetMapping 用于 aby use4 提供的字段。 这里可以提供 aby 字段 但是,如果提供了 id 以外的任何字段,则 id 必须为空。如果提供了 id,则所有其他 cmus5 都为空

还有一个复杂的 @PutMapping 要求, 在什么地方, 为更新提供了部分信息,rxspect 剩余字段应为旧值。此处更新了非空白字段。

另一个 @DeleteMapping 用于删除或移除一个公司信息 如果强制为空白,可以使用 @Null 约束。

通常的 crud 操作太简单了,但不适合满足期望的用例

所有这些混合 9f 要求都可以分组列出。 并且可以使用带有单独 Marke4 接口的组属性来提供约束。 @Validated 可以根据 eequirem2nt 应用

答案 2 :(得分:-1)

this文档引用,这里是空注释的要求。

  

乍看之下,按合同设计的API规范使用空注释只意味着所有API方法的签名都应该完全注释,即除了像int这样的基本类型每个参数和每个方法返回类型应该是标记为@NonNull或@Nullable。因为这意味着要插入很多空注释,所以很高兴知道在设计良好的代码(特别是API方法)中,@ NonNull比@Nullable更频繁。因此,通过在包级别使用@NonNullByDefault批注声明@NonNull作为默认值,可以减少注释的数量。

然而,说了这句话,是的,你是对的,@ Null没有多大意义,并且在一个设计合理的代码中,@ NotNull更重要,更频繁。 @Null或@Nullable只是为了表示在这里需要空值,并且有助于防止调用者和被调用者对空值进行冗余检查。希望这会有所帮助。