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