java - 使用 hibernate 6.0.10 验证结果来自 EachPattern 的 ConstraintDefinitionException

标签 java spring hibernate validation spring-boot

当我尝试使用 @EachPattern在列表中:

@EachPattern(
   regexp = "^[a-z]+",
   message = "Invalid"
)
public List<String> getTestItems()
{
    return Arrays.asList( "aaaaa" );
}

我收到以下错误:

Caused by: javax.validation.ConstraintDefinitionException: HV000243: Constraint cz.jirutka.validator.collection.constraints.EachPattern references constraint validator type cz.jirutka.validator.collection.CommonEachValidator, but this validator is defined for constraint type java.lang.annotation.Annotation.
    at org.hibernate.validator.internal.engine.constraintvalidation.ClassBasedValidatorDescriptor.of(ClassBasedValidatorDescriptor.java:48)
    at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintValidatorDescriptor.forClass(ConstraintValidatorDescriptor.java:49)
    at org.hibernate.validator.internal.metadata.core.ConstraintHelper.lambda$getDefaultValidatorDescriptors$6(ConstraintHelper.java:1001)
    at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
    at java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:948)
    at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
    at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
    at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
    at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
    at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)
    at org.hibernate.validator.internal.metadata.core.ConstraintHelper.getDefaultValidatorDescriptors(ConstraintHelper.java:1002)
    at org.hibernate.validator.internal.metadata.core.ConstraintHelper.lambda$getAllValidatorDescriptors$2(ConstraintHelper.java:730)
    at java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1660)
    at org.hibernate.validator.internal.metadata.core.ConstraintHelper$ValidatorDescriptorMap.computeIfAbsent(ConstraintHelper.java:1043)
    at org.hibernate.validator.internal.metadata.core.ConstraintHelper$ValidatorDescriptorMap.access$100(ConstraintHelper.java:1033)
    at org.hibernate.validator.internal.metadata.core.ConstraintHelper.getAllValidatorDescriptors(ConstraintHelper.java:730)
    at org.hibernate.validator.internal.metadata.core.ConstraintHelper.findValidatorDescriptors(ConstraintHelper.java:744)
    at org.hibernate.validator.internal.metadata.core.ConstraintHelper.assertValidationAppliesToParameterSetUpCorrectly(ConstraintHelper.java:923)
    at org.hibernate.validator.internal.metadata.core.ConstraintHelper.lambda$isConstraintAnnotation$5(ConstraintHelper.java:864)
    at java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1660)
    at org.hibernate.validator.internal.metadata.core.ConstraintHelper.isConstraintAnnotation(ConstraintHelper.java:860)
    at org.hibernate.validator.internal.metadata.provider.AnnotationMetaDataProvider.findConstraintAnnotations(AnnotationMetaDataProvider.java:507)
    at org.hibernate.validator.internal.metadata.provider.AnnotationMetaDataProvider.findConstraints(AnnotationMetaDataProvider.java:461)
    at org.hibernate.validator.internal.metadata.provider.AnnotationMetaDataProvider.findExecutableMetaData(AnnotationMetaDataProvider.java:302)
    at org.hibernate.validator.internal.metadata.provider.AnnotationMetaDataProvider.getMetaData(AnnotationMetaDataProvider.java:285)
    at org.hibernate.validator.internal.metadata.provider.AnnotationMetaDataProvider.getMethodMetaData(AnnotationMetaDataProvider.java:272)
    at org.hibernate.validator.internal.metadata.provider.AnnotationMetaDataProvider.retrieveBeanConfiguration(AnnotationMetaDataProvider.java:134)
    at org.hibernate.validator.internal.metadata.provider.AnnotationMetaDataProvider.getBeanConfiguration(AnnotationMetaDataProvider.java:124)
    at org.hibernate.validator.internal.metadata.BeanMetaDataManager.getBeanConfigurationForHierarchy(BeanMetaDataManager.java:220)
    at org.hibernate.validator.internal.metadata.BeanMetaDataManager.createBeanMetaData(BeanMetaDataManager.java:187)
    at org.hibernate.validator.internal.metadata.BeanMetaDataManager.lambda$getBeanMetaData$0(BeanMetaDataManager.java:160)
    at java.util.concurrent.ConcurrentMap.computeIfAbsent(ConcurrentMap.java:324)
    at org.hibernate.validator.internal.metadata.BeanMetaDataManager.getBeanMetaData(BeanMetaDataManager.java:159)
    at org.hibernate.validator.internal.engine.ValidatorImpl.buildNewLocalExecutionContext(ValidatorImpl.java:749)
    at org.hibernate.validator.internal.engine.ValidatorImpl.access$200(ValidatorImpl.java:85)
    at org.hibernate.validator.internal.engine.ValidatorImpl$CascadingValueReceiver.doValidate(ValidatorImpl.java:681)
    at org.hibernate.validator.internal.engine.ValidatorImpl$CascadingValueReceiver.indexedValue(ValidatorImpl.java:657)
    at org.hibernate.validator.internal.engine.valueextraction.ListValueExtractor.extractValues(ListValueExtractor.java:26)
    at org.hibernate.validator.internal.engine.valueextraction.ListValueExtractor.extractValues(ListValueExtractor.java:16)
    at org.hibernate.validator.internal.engine.valueextraction.ValueExtractorHelper.extractValues(ValueExtractorHelper.java:42)
    at org.hibernate.validator.internal.engine.ValidatorImpl.validateCascadedContainerElementsForCurrentGroup(ValidatorImpl.java:627)
    at org.hibernate.validator.internal.engine.ValidatorImpl.validateCascadedConstraints(ValidatorImpl.java:576)
    at org.hibernate.validator.internal.engine.ValidatorImpl.validateInContext(ValidatorImpl.java:389)
    at org.hibernate.validator.internal.engine.ValidatorImpl.validate(ValidatorImpl.java:169)

但是有问题的类不是我的,而是@EachPattern本身,它有:@Constraint(validatedBy = CommonEachValidator.class)那个类(class)有public class CommonEachValidator implements ConstraintValidator<Annotation, Collection<?>>这似乎导致了这个问题。

我正在使用:

compile("org.hibernate:hibernate-core:5.0.12.Final")
compile("org.hibernate:hibernate-entitymanager:5.0.12.Final")
compile("org.hibernate:hibernate-validator:6.0.10.Final")
compile("javax.validation:validation-api:2.0.1.Final")

如何修复此错误?

最佳答案

使用 hibernate-validator 6.0.10,您可以传递地引入对具有新功能的 Bean Validation API (javax.validation:validation-api:2.0.1.Final) 的依赖,including更灵活的容器类型级联验证,因此基本上您可以向类型为 java.util.Iterable、java.util.List 和 java.util.Map 的集合元素添加验证注释

因此您可以删除 cz.jirutka.validator.collection.constraints.EachPattern 并改为使用 javax.validation.constraints' @Pattern 以下方式:

public List<@Pattern(regexp = "^[a-z]+", message = "Invalid") String> getTestItems()
{
    return Arrays.asList( "aaaaa" );
}

关于java - 使用 hibernate 6.0.10 验证结果来自 EachPattern 的 ConstraintDefinitionException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50979808/

相关文章:

java - JPA 与可连接的一对多映射问题

java - 根据导航目的地更新 ActionBar 菜单

Spring 在集成测试中 Autowiring HttpServletRequest

java - 无法运行具有 7 个字段的调度程序 cron 表达式

java - Spring Boot 。找不到类型为 'org.hibernate.SessionFactory' 的 bean

java - Hibernate 搜索查找短语的部分匹配

hibernate - SELECT bla1,bla2 FROM foo的条件

java - 关于如何为 Hbase 编写 Hadoop InputFormat/OutputFormat 的任何想法

c# - 保持库无依赖性

java - 在 Android 游戏逻辑中解锁关卡