Jakarta ee 什么是约束验证点@Null?

Jakarta ee 什么是约束验证点@Null?,jakarta-ee,constraints,bean-validation,Jakarta Ee,Constraints,Bean Validation,我正在签入javax.validation包,我注意到有一个注释强制字段为空 如果我已经知道它应该为空,我不明白将它添加到我的字段中有什么意义 例如,看看这个类: public class MyClass{ @NotNull private String myString1; @Null private String myString2; // getter setters... } @NotNull完全有道理。我不希望myString1为空。但是

我正在签入
javax.validation
包,我注意到有一个注释强制字段为空

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

例如,看看这个类:

public class MyClass{

    @NotNull
    private String myString1;

    @Null
    private String myString2;

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

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

乍一看,按照合同设计的思路,对API规范使用空注释仅意味着所有API方法的签名都应进行完全注释,即,除int等基本类型外,每个参数和每个方法返回类型都应标记为@NonNull或@Nullable。因为这意味着要插入很多空注释,所以最好知道在设计良好的代码(尤其是API方法)中,@NonNull比@Nullable更频繁。因此,通过在包级别使用@NonNullByDefault注释,将@NonNull声明为默认值,可以减少注释的数量


然而,尽管如此,您是对的,@Null没有多大意义,而且在一个设计良好的适当代码中,@NotNull更重要,更频繁@Null或@Nullable的存在只是为了表示此处需要Null值,并有助于防止调用者和被调用者对Null值进行冗余检查。希望这有帮助。

您可能希望结合使用
@Null
和“验证组”仅在某些情况下验证Null约束

您将把验证组定义为简单接口

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
是提供的非常重要的注释。 这不是无用的。 让我展示一个常见的用例。 比如说,有Dao对象(实体)对象 具有自动生成的id。 如果您想对Dto和Dao使用单个ckass

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

@PutMapping
预期id不能为空,因此当我们预期丁格尔对象发生更新时,id字段需要
@NotNull

@DeleteMapping
仅需要整数foeld Id,仅当我们要删除具有已知Id的对象时

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

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

还有一个复杂的
@PutMapping
要求, 在哪里, 为更新提供了部分信息,rxpect剩余字段应为旧值。此处,非空白字段被升级

另一个
@DeleteMapping
来删除或删除第一个信息 如果强制为空,则可以使用
@Null
约束实现

通常的crud操作过于简单,但不适合实际期望

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

它不应始终为空。在验证对象时,它应该为null。假设一个字段是类的一部分,但不能由用户提交,因为它是稍后计算并添加到对象中的,例如。该字段还可用于分组验证约束和定义方法的结果。@JBNizet,我理解您的用例,但我不认为该字段应该在用户输入类中,因为用户与它无关。如果我想添加额外的字段,我应该将用户输入类转换为其他类。如果我继续使用同一个类,我将无法再验证它,这违背了这些约束验证的目的。我并不是说这样做是一个好主意。我只是说它会发生,在这种情况下Null是有用的。@JBNizet是正确的。它是针对不同情况的简单约束。例如,
ID
字段在保存到数据库之前应为
null
的实体。或者您有一个应该保存到系统中的对象,但某些字段(例如某些paymentID)应该由第三方服务检索和更新,在这种情况下,当您要保存此对象时,请验证此字段@Null,然后其他线程(服务)将读取此对象并另外更新该字段。所以一切都取决于你的用例。谢谢你的回答。提供的文档是关于
@NonNull
@Nullable
的,但这个问题是关于
javax.validation
注释
@Null
以及它在valida中的可能用法