diff --git a/engine/src/main/java/org/hibernate/validator/internal/metadata/provider/AnnotationMetaDataProvider.java b/engine/src/main/java/org/hibernate/validator/internal/metadata/provider/AnnotationMetaDataProvider.java index b65b9457ac..2801600b5a 100644 --- a/engine/src/main/java/org/hibernate/validator/internal/metadata/provider/AnnotationMetaDataProvider.java +++ b/engine/src/main/java/org/hibernate/validator/internal/metadata/provider/AnnotationMetaDataProvider.java @@ -666,11 +666,27 @@ private Map, CascadingMetaDataBuilder> getTypeParametersCascadin else if ( annotatedType instanceof AnnotatedParameterizedType ) { return getTypeParametersCascadingMetaDataForParameterizedType( (AnnotatedParameterizedType) annotatedType, typeParameters ); } + else if ( typeParameters.length > 0 ) { + return getTypeParametersCascadingMetaDataForParameterizedType( annotatedType, typeParameters ); + } else { return Collections.emptyMap(); } } + private Map, CascadingMetaDataBuilder> getTypeParametersCascadingMetaDataForParameterizedType(AnnotatedType annotatedType, TypeVariable[] typeParameters) { + // We did not get the parameterized (annotated) type but a raw one instead. (because we have the type variables) + // There won't be any cascading on the type variables since ... it's a raw type so we just create a placeholder instead: + Map, CascadingMetaDataBuilder> typeParametersCascadingMetadata = CollectionHelper.newHashMap( typeParameters.length ); + + for ( TypeVariable typeParameter : typeParameters ) { + typeParametersCascadingMetadata.put( typeParameter, new CascadingMetaDataBuilder( annotatedType.getType(), typeParameter, + false, Map.of(), Map.of() ) ); + } + + return typeParametersCascadingMetadata; + } + private Map, CascadingMetaDataBuilder> getTypeParametersCascadingMetaDataForParameterizedType( AnnotatedParameterizedType annotatedParameterizedType, TypeVariable[] typeParameters) { Map, CascadingMetaDataBuilder> typeParametersCascadingMetadata = CollectionHelper.newHashMap( typeParameters.length ); diff --git a/engine/src/test/java/org/hibernate/validator/test/internal/engine/ValidatorFactoryBeanMetadataClassNormalizerTest.java b/engine/src/test/java/org/hibernate/validator/test/internal/engine/ValidatorFactoryBeanMetadataClassNormalizerTest.java index ff979e1eb0..836cb9c7df 100644 --- a/engine/src/test/java/org/hibernate/validator/test/internal/engine/ValidatorFactoryBeanMetadataClassNormalizerTest.java +++ b/engine/src/test/java/org/hibernate/validator/test/internal/engine/ValidatorFactoryBeanMetadataClassNormalizerTest.java @@ -34,7 +34,7 @@ public class ValidatorFactoryBeanMetadataClassNormalizerTest { @Test(expectedExceptions = ValidationException.class, - expectedExceptionsMessageRegExp = ".*No suitable value extractor found for type interface java.util.List.*") + expectedExceptionsMessageRegExp = ".*No validator could be found for constraint 'jakarta.validation.constraints.Email' validating type 'java.lang.Object'.*") public void testBeanMetaDataClassNormalizerNoNormalizer() throws NoSuchMethodException { ValidatorFactory validatorFactory = Validation.byDefaultProvider() .configure() @@ -110,6 +110,8 @@ public Class normalize(Class beanClass) { private static class BeanProxy extends Bean implements MyProxyInterface { // The proxy dropped the generics, but kept constraint annotations, // which will cause trouble unless its metadata is ignored. + // We won't be able to find a suitable constraint validator for email + // since we will be looking for an impl for the `Object`. @Override @SuppressWarnings("unchecked") public void setEmails(@Email(payload = Unwrapping.Unwrap.class) List emails) { diff --git a/pom.xml b/pom.xml index 707d7da123..f394fafdff 100644 --- a/pom.xml +++ b/pom.xml @@ -155,7 +155,7 @@ These dependencies should be aligned with the ones from the WildFly version we support See http://search.maven.org/#search|gav|1|g%3A"org.wildfly"%20AND%20a%3A"wildfly-parent" --> - 1.7.1 + 1.7.3 2.14.0 2.0.17 2.25.3