您可以使用@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使用单独的类,@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