当前位置: 首页 > 知识库问答 >
问题:

使用Spring在DDD中验证

万俟修诚
2023-03-14

我将在Spring中使用DDD构建一个新应用程序。我将有一个REST适配器、一个JPA适配器和我的域模型。

我的问题是在哪里进行现场验证?假设我有一个REST方法来下订单,我应该在哪里验证请求中的订单数量是否大于0?在REST适配器的DTO中?或者在我的域实体中,因为验证应该是业务逻辑的一部分?

如果我在REST请求的DTO中进行验证,我就可以将验证检查添加到DTO的字段中,并在我的REST控制器中使用@Valid注释进行验证。在这种情况下,控制器将直接向客户端返回验证错误。

但这是在DDD中做这件事的正确方式吗?

当我在我的领域中进行验证时,我仍然有点困惑。我需要REST响应中的验证错误。

如果我有这个控制器:

  @RequestMapping(
      method = RequestMethod.POST,
      path = "/orders",
      consumes = MediaType.APPLICATION_JSON_VALUE)
  public ResponseEntity<String> addOrder(@RequestBody orderDTO orderDTO) {
    Order order = ... // map to domain opject
    Set<ConstraintViolation<Order>> violations = orderService.validate(order);
    if(violations.isEmpty()) {
      orderService.save(order);
      return ResponseEntity.ok().build();
    } else {
      return ResponseEntity.badRequest().build();
    }
  }

以及这样的域服务:

public class OrderServiceImpl implements OrderService {

  public Set<ConstraintViolation<Order>> validate(Order order) {
    ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
    Validator validator = factory.getValidator();
    Set<ConstraintViolation<Order>> violations = validator.validate(order);
    return violations;
  }

  public void save(Order order) {
    orderRepository.save(order);
  }
}

在响应中将验证错误作为JSON有效负载的最佳方法是什么?这是正确的方法吗?我在域服务中找不到任何验证的好例子,并在响应中将验证错误发送回客户端。

共有1个答案

谢宸
2023-03-14

肯定是领域模型,可能两者都有。

首先,在域模型中。数量检查是一个业务规则,所以这个不变量应该由域实体来保护。这意味着你的域实体确保所有不变量都被强制执行。你的域实体不应该让自己在无效状态下被创建(或更新)。

其次,如果您想要为用户提供最佳体验,您可以在DTO模型本身上实现额外的验证(使用注释或其他方式)。

 类似资料:
  • 由于这个问题,我想我理解了验证是如何工作的。 至于JPA,这里我们有一个名为JSR-303的规范,解释了Bean验证应该如何工作,然后我们也使用了常用的Hibernate Validator或Apache BVal等实现。 我正在努力在我的代码的某些部分使用。我没有使用,因为我不需要组验证。 您可以在此处找到演示项目的示例 在PropertyExample类中,您可以看到我标记了我的类以进行bea

  • 问题内容: 我是DDD的新手,并且正在尝试将其应用于现实生活中。毫无疑问,此类验证逻辑(如空检查,空字符串检查等)直接进入实体构造函数/属性。但是,如何验证某些全球规则(例如“唯一用户名”)呢? 因此,我们有实体用户 和用户存储库 选项有: 将存储库注入实体 将存储库注入工厂 在域服务上创建操作 ??? 并且每个选项都更加详细: 1。将存储库注入实体 我可以查询实体构造函数/属性中的存储库。但是我

  • null 我们尝试了几件事: > 发出命令: 激发命令 同步处理此命令,如果命令无效或引发事件,则返回错误。 null 缺点:-据我所知,应该用佐贺来编排流程。这里我们介绍“验证”的概念。我不确定这是不是推荐的方法。 验证是一个非常常见的概念。在分布式完全异步系统中如何处理它?

  • 我想用以下值从Ruby代码发送http请求: http://some_domain.com?key=value 我有这个Spring配置: Spring转换配置: 但我有一个错误: 你知道我如何解决这个问题吗?我可以在Spring以某种方式禁用这个CSRF检查吗?

  • 问题内容: 我在这里尝试了答案中的步骤:HibernateValidator,自定义ResourceBundleLocator和Spring 但是仍然只是作为输出而不是消息。 dispatcher-servlet.xml /WEB-INF/validationMessages.properties: 表格(上课地点) 这是怎么了 问题答案: 得到它了!:-) 我在我的计算机中添加了以下bean而不

  • 我正在构建一个Spring Boot应用程序,并试图为我将在服务层验证的一些DTO/实体实现自定义验证。基于Spring关于这个问题的文档,我认为一种方法是实现org。springframework。验证。验证程序界面。 作为一个最小、完整、可重复的示例,请考虑以下代码: Spring初始化引导项目 在src/main/java/com中添加了以下代码。实例使用验证: 如果我点击endpoint触