@Null约束验证的意义是什么?

28

我正在查看javax.validation包中的可用限制条件列表,并注意到有一个注解@Null,它强制该字段为null。

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

例如,看看这个类:

public class MyClass{

    @NotNull
    private String myString1;

    @Null
    private String myString2;

    // getter setters...
}

@NotNull 完全有意义。我不希望myString1为空。但是@NullmyString2变得毫无意义。拥有一个始终为null的字段有什么意义呢。


16
它不应该总是为空。在对象被验证时它应该为空。比如,想象一个属于类的字段,但用户不能提交它,因为它是计算后添加到对象中的。 - JB Nizet
还可以用于分组验证约束和定义方法的结果。 - Hamid
1
@JBNizet,我理解你的用例,但是我不认为该字段应该在用户输入类中,因为用户与其无关。如果我想要添加额外的字段,我应该将用户输入类转换为另一个类。如果我继续使用同一个类,就无法进行验证,这违反了约束验证的目的。 - Arashsoft
1
我并不是在说这样做是一个好主意。我只是在说它确实会发生,并且在那种情况下Null是有用的。 - JB Nizet
@JBNizet是对的。这是针对不同情况的简单约束。例如,实体具有“ID”字段,在保存到数据库之前应为“null”。或者您有一个对象应该保存到系统中,但是某些字段,例如某些paymentID应该由第三方服务检索和更新,在这种情况下,当您要保存此对象时,您会验证此字段@Null,然后一些其他线程(服务)将读取此对象并另外更新该字段。所以一切都取决于您的用例。 - Andriy Rymar
@JBNizet 请将您的评论作为答案添加,我会接受它。除了您提到的用例之外,似乎没有其他用例。 - Arashsoft
2个回答

20

您可以使用@Null与“验证组”结合使用,仅在某些情况下验证null约束。

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表示一切正常。背后可能有自定义实现,以处理带有非空结果的注释方法,但我没有深入研究代码...

5

@Null是一个非常重要的注解,它并不是无用的。让我来展示一个常见的用例。假设有一个DAO(实体)对象,其中Id是自动生成的。

如果您为DTO和DAO使用单独的类,@GetMapping返回DTO列表没有问题。另一方面,添加新元素的@PostMapping要求输入的DTO不能包含Id字段,即使存在也必须为空或未定义的状态。当将此输入转换为DTO对象时,期望Id必须为空白。因此,@Null是唯一的选择。

@PutMapping期望id不为空,因此在期望对单个对象进行更新时,需要对id字段进行@NotNull约束。

@DeleteMapping只需要整数Id,仅在我们想要删除已知Id的对象时才需要它。

还有一些复杂的替代案例,通常不被处理,但是很有意义

@GetMapping可以用于任何提供的字段,但是如果提供除Id以外的任何字段,则Id必须为空白。如果提供了Id,则所有其他字段必须为空白。

还有一个复杂的@PutMapping需求,其中提供了部分信息以进行更新,并期望剩余字段保持旧值。这里非空字段将被更新。

另一个注解@DeleteMapping用于删除或移除。如果将其计算为空白,则可以使用@Null约束来实现。

通常的CRUD操作太简单了,不适合实际期望。

所有这些需求的混合可以分为组,并且可以根据需要提供具有单独标记接口的组属性的约束@Validated


但是混淆来自于:@Null 表示一个字段应该始终为 null(与 @Nullable 相反,它表示有时可以为 null)。因此,如果一个字段应该始终为 null,并且任何时候不为 null 都是约束违规:那么为什么还要有这个字段呢? - Ian Boyd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接