Che*_*rry 1 java bean-validation spring-validator
我已经实现了Long字段和@PastOrPresent验证的验证
public class PastOrPresentValidator implements ConstraintValidator<PastOrPresent, Long>{
@Override
public boolean isValid(Long value, ConstraintValidatorContext context) {
if (value == null) {
return false;
}
return value <= System.currentTimeMillis();
}
}
public class MyDto {
@PastOrPresent
Long timestamp;
}
Run Code Online (Sandbox Code Playgroud)
并得到错误:
HV000030: No validator could be found for constraint 'javax.validation.constraints.PastOrPresent' validating type 'java.lang.Long'. Check configuration for 'push.dto.timestamp'
Run Code Online (Sandbox Code Playgroud)
但是当我创建自定义注释@PastOrPresentLong并使用相同的验证器代码时,一切正常。
有没有办法为javax.validation.constraints注释添加自定义验证器?
小智 6
仅实现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>
Run Code Online (Sandbox Code Playgroud)
然后,如果您使用 Hibernate Validator 作为 BeanValidation 提供者,您还有两个选择 - 使用服务加载器或编程定义。使用 Service loader 是添加新验证器的最简单方法。您需要做的就是创建一个META-INF/services/javax.validation.ConstraintValidator文件并向其中添加验证器的 FQCN。请参阅本详细的例子后下或在部分“非标类用标准的约束”文档。使用程序化方法,您必须执行以下操作:
ConstraintMapping constraintMapping = configuration.createConstraintMapping();
constraintMapping
.constraintDefinition( PastOrPresent.class )
.validatedBy( PastOrPresentLongValidator.class );
Run Code Online (Sandbox Code Playgroud)
然后将此约束映射添加到您的配置并从中创建验证器:
Validator validator = configuration.addMapping( constraintMapping )
.buildValidatorFactory()
.getValidator();
Run Code Online (Sandbox Code Playgroud)
但正如我之前提到的 - Service Loader 是最简单快捷的方式。
| 归档时间: |
|
| 查看次数: |
6222 次 |
| 最近记录: |