什么是约束点验证@Null?

Ara*_*oft 15 constraints java-ee bean-validation

我检查可用约束的列表javax.validation包,我注意到,有一个注释@null迫使现场为空.

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

例如,看看这个类:

public class MyClass{

    @NotNull
    private String myString1;

    @Null
    private String myString2;

    // getter setters...
}
Run Code Online (Sandbox Code Playgroud)

@NotNull完全有道理.我不希望myString1是空的.但@NullmyString2没用.有一个字段应始终为null的重点是什么.

Thr*_*ots 5

您可能只想@Null在某些情况下与“验证组”结合使用以验证空约束。

Hibernate提供的关于验证组的良好解释和示例

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

public interface FirstSave {}
Run Code Online (Sandbox Code Playgroud)

然后在约束中使用它

public class MyClass {

    @Null(groups = FirstSave.class)
    private LocalDate lastUpdate;
}
Run Code Online (Sandbox Code Playgroud)

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

你也有可能提供关于如何使用注解自己的实现,也就是我见过的验证方法被标注了@Null其中null的意思是一切正常的方法返回。在后台,如果带注释的方法返回的结果不是空值,可能会有自定义实现,但我没有深入研究代码...


小智 5

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

如果您对 DTO 和 DAO 使用单独的类,@GetMapping则返回 DTO 列表,不会出现问题。另一方面,@PostMapping添加新元素要求输入 DTO 不得包含 Id 字段,即使存在,它也必须为 null 或未定义。此类输入在与 DTO 对象进行转换时,要求 Id 必须为空。为此,@Null唯一的选择

@PutMapping期望 id 不能为空,因此@NotNull当我们期望更新发生在单个对象上时,id 字段是必需的。

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

还有一些复杂的情况,通常不会被处理,但有意义

@GetMapping可用于任何提供的字段,但如果提供了除 Id 之外的任何字段,则 Id 必须为空。如果提供了 ID,则其他所有内容都必须为空。

还有一个复杂的@PutMapping要求,其中提供部分信息用于更新,并且期望剩余字段为旧值。这里非空字段被更新。

另一个注解@DeleteMapping是用来删除或移除的。如果计算为空白,则可以通过@Null约束来实现。

通常的 CRUD 操作过于简单,但不适合实际期望的用例。

所有这些需求组合都可以分组列出。并且可以通过组属性提供约束,并@Validated可以根据需要应用单独的标记接口。