Для реализации вашего нового валидатора недостаточно просто реализовать интерфейс ConstraintValidator
.Он должен быть каким-то образом зарегистрирован, чтобы поставщик BeanValidation знал об этом.Это можно сделать с помощью XML (см. Дополнительную информацию здесь ):
<constraint-mappings
xmlns="http://xmlns.jcp.org/xml/ns/validation/mapping"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/validation/mapping
http://xmlns.jcp.org/xml/ns/validation/mapping/validation-mapping-2.0.xsd"
version="2.0">
<!-- anything else -->
<constraint-definition annotation="javax.validation.constraints.PastOrPresent">
<validated-by include-existing-validators="true">
<value>org.mycompany.PastOrPresentLongValidator</value>
</validated-by>
</constraint-definition>
</constraint-mappings>
Тогда, если вы используете Hibernate Validator в качестве поставщика BeanValidation, у вас также есть еще два варианта - использовать загрузчик служб илипрограммное определение.Использование Service Loader - это самый простой способ добавить новый валидатор.Все, что вам нужно сделать, это создать файл META-INF/services/javax.validation.ConstraintValidator
и добавить к нему FQCN вашего валидатора.См. Подробные примеры в этой записи в разделе «Использование стандартных ограничений для нестандартных классов» или в doc .При программном подходе вам нужно будет сделать что-то вроде:
ConstraintMapping constraintMapping = configuration.createConstraintMapping();
constraintMapping
.constraintDefinition( PastOrPresent.class )
.validatedBy( PastOrPresentLongValidator.class );
И затем добавить это сопоставление ограничений в вашу конфигурацию и создать из него валидатор:
Validator validator = configuration.addMapping( constraintMapping )
.buildValidatorFactory()
.getValidator();
Но, как я упоминал ранее, Service Loader - это самый простой и быстрый способ.