Зарегистрируйте пользовательский ConstraintValidator для существующего ограничения

Я использую bean-валидацию в своем проекте, и я хотел бы написать собственный валидатор для существующей аннотации ограничения.

Например, у меня есть класс, представляющий дату/время с именем CustomDateTime. В классе, который использует этот класс, например, как дату рождения, я хотел бы аннотировать поле с помощью @Past:

public class Person
{
    @Past
    private CustomDateTime dateOfBirth;
}

Затем я создаю собственный валидатор, реализуя ConstraintValidator<Past, CustomDateTime>. Однако это не работает, поскольку реализация проверки не знает о пользовательском средстве проверки. Затем он выдает: javax.validation.UnexpectedTypeException: No validator could be found for type: com.example.CustomDateTime.

Я знаю, что вы обычно создаете отдельную аннотацию следующим образом:

@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = {CustomDateTimePastValidator.class})
public @interface Past
{
    ....
}

Но мне это кажется двойным кодом ;-)

Как я могу зарегистрировать пользовательский валидатор для использования с @Past?


person siebz0r    schedule 14.01.2013    source источник


Ответы (1)


Вы можете определить на основе XML сопоставление ограничений, которое добавляет ваш валидатор ограничений для существующего ограничения @Past:

<?xml version="1.0" encoding="UTF-8"?>
<constraint-mappings
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://jboss.org/xml/ns/javax/validation/mapping validation-mapping-1.0.xsd"
    xmlns="http://jboss.org/xml/ns/javax/validation/mapping">

    <constraint-definition annotation="javax.validation.constraints.Past">
        <validated-by include-existing-validators="true">
            <value>com.acme.CustomDateTimePastValidator</value>
        </validated-by>
    </constraint-definition>
</constraint-mappings>

Затем либо укажите это сопоставление в своем валидация.xml:

<?xml version="1.0" encoding="UTF-8"?>
<validation-config
    xmlns="http://jboss.org/xml/ns/javax/validation/configuration"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://jboss.org/xml/ns/javax/validation/configuration">

    <constraint-mapping>/path/to/constraint-mapping.xml</constraint-mapping>
</validation-config>

Или вы добавляете его во время начальной загрузки вашего валидатора:

InputStream mappingStream = ...;

Validator validator = Validation
    .byDefaultProvider()
    .configure()
    .addMapping( mappingStream )
    .buildValidatorFactory()
    .getValidator();
person Gunnar    schedule 14.01.2013