为现有约束注册自定义ConstraintValidator

时间:2013-01-14 14:55:47

标签: constraints bean-validation custom-validators

我在项目中使用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一起使用的自定义验证器?

1 个答案:

答案 0 :(得分:5)

您可以定义XML-based constraint mapping,为现有的@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>

然后在validation.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();
相关问题