使用验证器依赖注入配置自定义验证
Configuring custom validation with validator dependancy injection
我正在尝试使用 Hibernate Validation 6.0.1 定义约束定义,其中验证器位于相对于约束注释的不同位置 (.jar/project)。 Aka,我有我想要验证的对象,它们在带有注释定义的项目 "api" 中,但我将在项目 "modules/common"
中拥有验证器
我正在按照 the documentation 中的描述进行操作。
配置文件
@Bean
public Validator validator() {
HibernateValidatorConfiguration configuration = Validation
.byProvider( HibernateValidator.class )
.configure();
ConstraintMapping constraintMapping = configuration.createConstraintMapping();
constraintMapping
.constraintDefinition(ValidationComplexePerson.class)
.validatedBy(ValidationComplexePersonValidator.class);
return configuration.addMapping( constraintMapping )
.buildValidatorFactory()
.getValidator();
约束注释
@Documented
@Constraint(validatedBy = { })
@Target({TYPE, ANNOTATION_TYPE})
@Retention(RUNTIME)
public @interface ValidationComplexePerson {
...}
验证者
public class ValidationComplexePersonValidator
implements ConstraintValidator<ValidationComplexePerson, Personne> {
@Override
public void initialize(ValidationComplexePerson constraintAnnotation) {
}
@Override public boolean isValid(
Personne personne,
ConstraintValidatorContext constraintValidatorContext) {
if (personne.nom.matches(".*\d+.*")) {
return false;
}
return true;
}
我的问题
我遇到的问题是,如果我不在注释中放置“@Constraint(validatedby={})”,我会得到错误
HV000116: The annotation type must be annotated with @javax.validation.Constraint when creating a constraint definition.
当达到 Bean 配置中的“.constraintDefinition”时。
另一方面,如果我输入“@Constraint(validatedby={})”,我会得到
Error:(17, 1) java: For non-composed constraints a validator
implementation must be specified using @Constraint#validatedBy().
关于此解决方案可能存在的问题或替代方案有什么建议吗?
我也尝试了here提供的程序。
我怀疑您正在使用注释处理器,因为您的第二个错误来自它?
问题是在这种情况下注释处理器检查不正确。我认为我们可能应该删除它,因为无法使此检查与程序化 API.
一起使用
暂时删除注释处理器,它应该可以正常工作。
我打开 https://hibernate.atlassian.net/browse/HV-1470 来跟踪这个问题。
我正在尝试使用 Hibernate Validation 6.0.1 定义约束定义,其中验证器位于相对于约束注释的不同位置 (.jar/project)。 Aka,我有我想要验证的对象,它们在带有注释定义的项目 "api" 中,但我将在项目 "modules/common"
中拥有验证器我正在按照 the documentation 中的描述进行操作。
配置文件
@Bean
public Validator validator() {
HibernateValidatorConfiguration configuration = Validation
.byProvider( HibernateValidator.class )
.configure();
ConstraintMapping constraintMapping = configuration.createConstraintMapping();
constraintMapping
.constraintDefinition(ValidationComplexePerson.class)
.validatedBy(ValidationComplexePersonValidator.class);
return configuration.addMapping( constraintMapping )
.buildValidatorFactory()
.getValidator();
约束注释
@Documented
@Constraint(validatedBy = { })
@Target({TYPE, ANNOTATION_TYPE})
@Retention(RUNTIME)
public @interface ValidationComplexePerson {
...}
验证者
public class ValidationComplexePersonValidator
implements ConstraintValidator<ValidationComplexePerson, Personne> {
@Override
public void initialize(ValidationComplexePerson constraintAnnotation) {
}
@Override public boolean isValid(
Personne personne,
ConstraintValidatorContext constraintValidatorContext) {
if (personne.nom.matches(".*\d+.*")) {
return false;
}
return true;
}
我的问题 我遇到的问题是,如果我不在注释中放置“@Constraint(validatedby={})”,我会得到错误
HV000116: The annotation type must be annotated with @javax.validation.Constraint when creating a constraint definition.
当达到 Bean 配置中的“.constraintDefinition”时。
另一方面,如果我输入“@Constraint(validatedby={})”,我会得到
Error:(17, 1) java: For non-composed constraints a validator implementation must be specified using @Constraint#validatedBy().
关于此解决方案可能存在的问题或替代方案有什么建议吗?
我也尝试了here提供的程序。
我怀疑您正在使用注释处理器,因为您的第二个错误来自它?
问题是在这种情况下注释处理器检查不正确。我认为我们可能应该删除它,因为无法使此检查与程序化 API.
一起使用暂时删除注释处理器,它应该可以正常工作。
我打开 https://hibernate.atlassian.net/browse/HV-1470 来跟踪这个问题。