У меня есть следующий класс данных:
public abstract class Item {
@NotNull
Type getType();
void setType(Type type);
[...]
}
и соответствующие подклассы для каждого значения Type
(enum). Затем валидатор должен проверить для всех (подтипов) Item
, что Type
принадлежит данному подклассу.
Реализация валидатора будет выглядеть примерно так:
boolean isValid(Item item) {
return getImplClassFor(item.getType()).isAssignableFrom(item.getClass());
}
Как я могу зарегистрировать такой валидатор в валидаторах по умолчанию java, чтобы он автоматически выбирался валидатором Spring / Hibernate ... (по возможности реализация c)
- spring- boot-starter-validation 2.xx
- hibernate-validator 6.0.x
- javax.validation-api 2.1 (или более поздней версии)
Я не могу добавить пользовательский аннотации к этому классу или любому из его подклассов, поскольку модель данных находится вне моего контроля (и создается).
Рассмотренные альтернативы:
Проверка типа вручную в качестве первого действия в каждом методе контроллера: это очень подвержено ошибкам, так как оно может быть забыто или случайно удалено. И это особенно трудно сделать правильно для вложенных структур данных.
Копирование и вставка класса элемента в реализацию и тайное добавление аннотации: так как модель данных находится вне моего контроля, я не получу уведомление, если они когда-либо изменят это Таким образом, класс и моя копия могут стать устаревшими / несовместимыми.
TLDR: Как зарегистрировать ConstraintValidator
для класса, который не имеет аннотаций.