Java 是否有标准方法验证数组中多个项之间的约束?
我正在开发一个restfulspringbootmicroservice,它有一个接受Java 是否有标准方法验证数组中多个项之间的约束?,java,spring,validation,Java,Spring,Validation,我正在开发一个restfulspringbootmicroservice,它有一个接受命令的POST端点 除其他字段外,订单包含一个产品数组,在本例中,该数组有两个字段,id和参数,都是字符串 我收到的一项要求是对产品数组进行验证,例如: 如果产品包含ID为123的项目, 然后它也不能包含ID为[234345]的项 及 如果产品包含ID为789的项目, 则任何ID在[456567]中的产品都必须具有非空参数字段 我已经将它们实现为自定义验证注释,使用两种方法conditionalOn和requi
命令的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,值是所有不兼容的产品
然后,您可以进行注释,以验证所需的元素。这是实现此类需求的糟糕方法。验证应该外部化到实用程序中。为验证订单/产品所需的方法创建一个接口,基于该接口实现一些规则类,然后通过规则传递订单。如果发生冲突,抛出异常。这是实现此类需求的一种糟糕方法。验证应该外部化到实用程序中。为验证订单/产品所需的方法创建一个接口,基于该接口实现一些规则类,然后通过规则传递订单。如果发生冲突,则引发异常。