我正在检查javax.validation
包中的list of available constraints,我注意到有一个注释@Null会强制该字段为空。
如果我已经知道它应该为空,我不明白将它添加到我的字段有什么意义。
例如,看看这个类:
public class MyClass{
@NotNull
private String myString1;
@Null
private String myString2;
// getter setters...
}
@NotNull
完全有道理。我不希望myString1
为空。但@Null
使myString2
无用。有一个字段应该始终为空是什么意义。
答案 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只是为了表示在这里需要空值,并且有助于防止调用者和被调用者对空值进行冗余检查。希望这会有所帮助。