Я работаю над загрузочным микросервисом RESTful Spring с конечной точкой POST, которая принимает Order
.
. Order
содержит, среди других полей, массив Product
, который для цель этого примера состоит из двух полей, id
и parameter
, оба из которых являются String.
Требование, которое я получил, состоит в том, чтобы реализовать проверку массива Product
, например, так:
IF товары содержат элемент с идентификатором 123, THEN и не могут содержать элемент с идентификатором [234, 345].
и
IF товары содержат элемент с идентификатором 789, THEN любой продукт с идентификатором в [456, 567] должен иметь поле ненулевого параметра.
Я реализовал их как пользовательские аннотации проверки с двумя методами conditionalOn
и required
- и затем валидатор для каждой аннотации, который реализует лог c для каждого утверждения: например, для первого,
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
?