我正在开发一个 RESTful Spring 启动微服务,其 POST 端点接受订单
。
Order
除其他字段外,还包含一个 Product
数组,在本示例中,该数组有两个字段:id
和 parameter
,均为字符串。
我收到的要求是对 Product
数组实现验证,例如:
如果产品包含 ID 为 123 的商品, 那么它不能还包含 ID 为 [234, 345] 的项目。
和
如果产品包含 ID 为 789 的商品, 那么任何 ID 为 [456, 567] 的产品都必须具有非空参数字段。
我已经将它们实现为自定义验证注释,使用两种方法 conditionalOn
和 required
- 然后为每个注释实现一个 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/