Java 全对象图的DDD验证

Java 全对象图的DDD验证,java,spring-boot,validation,domain-driven-design,Java,Spring Boot,Validation,Domain Driven Design,这是我的挑战,我们正在进行DDD,我们在构造函数内或通过构建方法(构建器模式)对对象进行验证。我想要实现的是能够以一种收集所有验证错误的方式构建完整的对象树 正如您在下面的代码中所看到的,我将仅收集缺少父级名字的子级错误 请注意,这些对象是手动创建的,否则,我只会添加@Valid之类的,但我认为当您手动构建对象时,这是行不通的 仅供参考:我使用spring引导堆栈 @Builder public class Child { @NotNull private String fir

这是我的挑战,我们正在进行DDD,我们在构造函数内或通过构建方法(构建器模式)对对象进行验证。我想要实现的是能够以一种收集所有验证错误的方式构建完整的对象树

正如您在下面的代码中所看到的,我将仅收集缺少父级名字的子级错误

请注意,这些对象是手动创建的,否则,我只会添加@Valid之类的,但我认为当您手动构建对象时,这是行不通的

仅供参考:我使用spring引导堆栈

@Builder
public class Child {

    @NotNull
    private String firstName;

我通常分离验证和域模型

例如,我对表示请求主体的视图应用验证(请参阅),然后仅在确定验证通过后才尝试实例化value对象。在您的情况下,这意味着您将把注释放在视图上,而不是VO上


请注意,对VO应用验证是没有意义的:您能够创建它意味着所有约束都已满足。

我通常将验证与域模型分离

例如,我对表示请求主体的视图应用验证(请参阅),然后仅在确定验证通过后才尝试实例化value对象。在您的情况下,这意味着您将把注释放在视图上,而不是VO上


请注意,在VO上应用验证是没有意义的:您能够创建它的事实意味着所有约束都已满足。

如果您在这里使用spring堆栈,则是一种方法:

创建名为父工厂的新组件。工厂将有效对象的创建封装在DDD中

在这个工厂内部,您可以使用构建器模式或构造函数调用——这并不重要,因为对象创建是抽象的


此外,
ParentFactory
注入了javax
验证器
,因此,如果使用spring堆栈,则能够执行上述任务

创建名为父工厂的新组件。工厂将有效对象的创建封装在DDD中

在这个工厂内部,您可以使用构建器模式或构造函数调用——这并不重要,因为对象创建是抽象的

此外,
ParentFactory
注入了javax
验证器
,因此能够执行上述任务

以提供域模型对象的错误列表,我通常在聚合根中收集所有可能产生的错误,聚合根再次从它的子域对象。这种方法遵循收集错误的思想,而不是在第一次出现错误时立即抛出异常

您可以研究一下这一点,它已经说明了这种方法的一个示例(尽管它是C代码,但模式与语言无关).

为了提供域模型对象的错误列表,我通常在聚合根中收集所有可能产生的错误,聚合根再次从其子域对象收集潜在错误。这种方法遵循收集错误的思想,而不是在第一次出现错误时立即抛出异常


您可以研究一下这一点,它已经说明了这种方法的一个示例(尽管它是C代码,但模式与语言无关)。

在DDD中,您的实体不负责执行“收集”错误之类的操作,除非这是您无处不在的语言的一部分。您要做的是让实体引发DomainEvent,您可以使用一个侦听器来收集和使用所有引发的事件。

在DDD中,您的实体不对“收集”错误之类的操作负责,除非这是您普遍使用的语言的一部分。您要做的是让实体引发DomainEvent,您可以使用单个侦听器收集和使用所有引发的事件

@Builder
public class Child {

    @NotNull
    private String firstName;
Parent.builder()
                .firstName(null)
                .child(Child.builder()
                        .firstName(null)
                        .build())
                .build();