java - 是否有一种标准方法来验证数组中多个项目之间的约束?

标签 java spring validation

我正在开发一个 RESTful Spring 启动微服务,其 POST 端点接受订单

Order 除其他字段外,还包含一个 Product 数组,在本示例中,该数组有两个字段:idparameter,均为字符串。

我收到的要求是对 Product 数组实现验证,例如:

如果产品包含 ID 为 123 的商品, 那么它不能还包含 ID 为 [234, 345] 的项目。

如果产品包含 ID 为 789 的商品, 那么任何 ID 为 [456, 567] 的产品都必须具有非空参数字段。

我已经将它们实现为自定义验证注释,使用两种方法 conditionalOnrequired - 然后为每个注释实现一个 validator ,该 validator 实现每个断言的逻辑:例如首先,

if (order.getProducts().stream().anyMatch(p -> annotation.conditionalOn().equals(p.getId()))) {
  return order.getProducts().stream().noneMatch(p -> annotation.required().equals(p.getId()));
}

但是 Order 上的字段最终会包含大量注释,其中一些注释是重复的,因为存在多个相同的约束。作为一个简化的示例,

class Order {
  @CombinationsNotAllowed({
    @CombinationNotAllowed(conditionalOn = "123", required = { "234", "345" }),
    @CombinationNotAllowed(conditionalOn = "321", required = { "432", "543" })
    // ... etc etc
  })
  ParametersRequired({
    @ParameterRequired(conditionalOn = "789", required = { "456", "567" }),
    @ParameterRequired(conditionalOn = "987", required = { "654", "765" })
    // ... etc etc
  })
  // further annotations
  private List<Product> products;
}

我也意识到这些限制可能会改变,尽管我不希望它们会改变。

是否有更标准的方法来定义 Order#getProducts 中的项目的这些约束?

最佳答案

使用组合来包装HashSet(或HashMap)并实现Iterable(或Collection)。在您的 add()addAll() 方法中验证您的约束。由于哈希表具有 O(1) 查找,因此它的性能相当高。

在映射不兼容性方面,您可以有一个列表映射,其中键是产品 ID,值是所有不兼容的产品。

然后您可以进行注释来验证所需的元素。

关于java - 是否有一种标准方法来验证数组中多个项目之间的约束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60566760/

相关文章:

java - 在无限循环中运行的 Spring Batch 作业

javascript - 服务器和客户端验证器 - 库

python - BigQuery JSON 架构验证

javascript - 删除类型为 ="number"的输入上的非数字会导致数字也被删除

Java:TreeModel中的preorderEnumeration,如何获取深度索引和兄弟索引?

java - Recyclerview 高度与屏幕一样大

java - 在Matlab环境中运行Java代码的步骤?

java - Spring MVC 重定向是在 url 中添加一些参数

java - 如何在 Spring 应用程序中配置 jetty 最大 header 大小

java - 如何使用 Jackson 将自定义方法的输出序列化为 JSON?