Java 是否有标准方法验证数组中多个项之间的约束?

Java 是否有标准方法验证数组中多个项之间的约束?,java,spring,validation,Java,Spring,Validation,我正在开发一个restfulspringbootmicroservice,它有一个接受命令的POST端点 除其他字段外,订单包含一个产品数组,在本例中,该数组有两个字段,id和参数,都是字符串 我收到的一项要求是对产品数组进行验证,例如: 如果产品包含ID为123的项目, 然后它也不能包含ID为[234345]的项 及 如果产品包含ID为789的项目, 则任何ID在[456567]中的产品都必须具有非空参数字段 我已经将它们实现为自定义验证注释,使用两种方法conditionalOn和requi

我正在开发一个restfulspringbootmicroservice,它有一个接受
命令的POST端点

除其他字段外,
订单
包含一个
产品
数组,在本例中,该数组有两个字段,
id
参数
,都是字符串

我收到的一项要求是对
产品
数组进行验证,例如:

如果产品包含ID为123的项目, 然后它也不能包含ID为[234345]的项

如果产品包含ID为789的项目, 任何ID在[456567]中的产品都必须具有非空参数字段

我已经将它们实现为自定义验证注释,使用两种方法
conditionalOn
required
——然后为每个注释提供一个验证器,用于实现每个断言的逻辑:例如,对于第一个断言

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;
}
类顺序{
@组合未安装({
@组合不允许(conditionalOn=“123”,required={“234”,“345”}),
@组合不允许(conditionalOn=“321”,required={“432”,“543”})
//…等等
})
所需参数({
@参数required(conditionalOn=“789”,required={“456”,“567”}),
@参数required(conditionalOn=“987”,required={“654”,“765”})
//…等等
})
//进一步说明
私人上市产品;
}
我也意识到这些约束可能会改变,尽管我并不期望它们会改变


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

使用组合包装哈希集(或哈希映射)并实现Iterable(或集合)。在
add()
addAll()
方法中,验证约束。因为哈希表有O(1)查找,所以它的性能相当好

就映射不兼容而言,您可以有一个列表映射,其中键是产品id,值是所有不兼容的产品


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

使用composition包装HashSet(或HashMap)并实现Iterable(或Collection)。在
add()
addAll()
方法中,验证约束。因为哈希表有O(1)查找,所以它的性能相当好

就映射不兼容而言,您可以有一个列表映射,其中键是产品id,值是所有不兼容的产品


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

这是实现此类需求的糟糕方法。验证应该外部化到实用程序中。为验证订单/产品所需的方法创建一个接口,基于该接口实现一些规则类,然后通过规则传递订单。如果发生冲突,抛出异常。这是实现此类需求的一种糟糕方法。验证应该外部化到实用程序中。为验证订单/产品所需的方法创建一个接口,基于该接口实现一些规则类,然后通过规则传递订单。如果发生冲突,则引发异常。