gpt4 book ai didi

java - 如何为 `javax.validation.constraints` 注释添加自定义 validator ?

转载 作者:行者123 更新时间:2023-12-01 19:42:35 24 4
gpt4 key购买 nike

我已经实现了 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;
}

出现错误:

HV000030: No validator could be found for constraint 'javax.validation.constraints.PastOrPresent' validating type 'java.lang.Long'. Check configuration for 'push.dto.timestamp'

但是当我创建像 @PastOrPresentLong 这样的自定义注释并使用相同的 validator 代码时,一切正常。

有没有办法为javax.validation.constraints注释添加自定义 validator ?

最佳答案

仅实现 ConstraintValidator 接口(interface)不足以让您的新 validator 正常工作。应该以某种方式注册它,以便 BeanValidation 提供者知道它。这可以通过 XML 来完成(更多信息请参见 here ):

<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 提供程序,您还有两个选择 - 使用服务加载器或编程定义。使用服务加载器是添加新 validator 的最简单方法。您需要做的就是创建一个 META-INF/services/javax.validation.ConstraintValidator 文件并向其中添加 validator 的 FQCN。请参阅此 post 中的详细示例在“对非标准类使用标准约束”部分或 doc 中。与programmatic approach你必须做类似的事情:

ConstraintMapping constraintMapping = configuration.createConstraintMapping();

constraintMapping
.constraintDefinition( PastOrPresent.class )
.validatedBy( PastOrPresentLongValidator.class );

然后将此约束映射添加到您的配置中并从中创建一个 validator :

Validator validator = configuration.addMapping( constraintMapping )
.buildValidatorFactory()
.getValidator();

但正如我之前提到的 - Service Loader 是最简单、最快的方法。

关于java - 如何为 `javax.validation.constraints` 注释添加自定义 validator ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54803388/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com