diff --git a/engine/src/main/java/org/hibernate/validator/internal/util/TypeHelper.java b/engine/src/main/java/org/hibernate/validator/internal/util/TypeHelper.java index 3e89ef0fcd..ac300527a8 100644 --- a/engine/src/main/java/org/hibernate/validator/internal/util/TypeHelper.java +++ b/engine/src/main/java/org/hibernate/validator/internal/util/TypeHelper.java @@ -571,7 +571,10 @@ private static Map getActualTypeArgumentsByParameterInternal(Type ty Map actualTypeArgumentsByParameter = new LinkedHashMap(); for ( int i = 0; i < typeParameters.length; i++ ) { - actualTypeArgumentsByParameter.put( typeParameters[i], typeArguments[i] ); + // we only add the mapping if it is not a cyclic dependency (see HV-1032) + if ( !typeParameters[i].equals( typeArguments[i] ) ) { + actualTypeArgumentsByParameter.put( typeParameters[i], typeArguments[i] ); + } } return actualTypeArgumentsByParameter; diff --git a/engine/src/test/java/org/hibernate/validator/test/internal/util/ChildEntity.java b/engine/src/test/java/org/hibernate/validator/test/internal/util/ChildEntity.java new file mode 100644 index 0000000000..97bda50c2b --- /dev/null +++ b/engine/src/test/java/org/hibernate/validator/test/internal/util/ChildEntity.java @@ -0,0 +1,14 @@ +/* + * Hibernate Validator, declare and validate application constraints + * + * License: Apache License, Version 2.0 + * See the license.txt file in the root directory or . + */ +package org.hibernate.validator.test.internal.util; + +/** + * @author Guillaume Smet + */ +public class ChildEntity extends ParentEntity { + +} diff --git a/engine/src/test/java/org/hibernate/validator/test/internal/util/ParentEntity.java b/engine/src/test/java/org/hibernate/validator/test/internal/util/ParentEntity.java new file mode 100644 index 0000000000..547d43045f --- /dev/null +++ b/engine/src/test/java/org/hibernate/validator/test/internal/util/ParentEntity.java @@ -0,0 +1,14 @@ +/* + * Hibernate Validator, declare and validate application constraints + * + * License: Apache License, Version 2.0 + * See the license.txt file in the root directory or . + */ +package org.hibernate.validator.test.internal.util; + +/** + * @author Guillaume Smet + */ +public class ParentEntity { + +} diff --git a/engine/src/test/java/org/hibernate/validator/test/internal/util/TypeHelperTest.java b/engine/src/test/java/org/hibernate/validator/test/internal/util/TypeHelperTest.java index 59268e6fa1..120ef5f2b9 100644 --- a/engine/src/test/java/org/hibernate/validator/test/internal/util/TypeHelperTest.java +++ b/engine/src/test/java/org/hibernate/validator/test/internal/util/TypeHelperTest.java @@ -21,6 +21,7 @@ import java.lang.reflect.GenericDeclaration; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; +import java.lang.reflect.ParameterizedType; import java.lang.reflect.Proxy; import java.lang.reflect.Type; import java.lang.reflect.TypeVariable; @@ -37,8 +38,8 @@ import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; - import org.hibernate.validator.internal.util.TypeHelper; +import org.hibernate.validator.testutil.TestForIssue; import static org.hibernate.validator.internal.util.CollectionHelper.newArrayList; import static org.testng.Assert.assertEquals; @@ -866,6 +867,15 @@ public void testTypeDiscovery() { assertNull( validatorsTypes.get( String.class ) ); } + @Test + @TestForIssue(jiraKey = "HV-1032") + public void testTypeHelperDoesntGoIntoInfiniteLoop() { + Type parentEntityType = ChildEntity.class.getGenericSuperclass(); + ParameterizedType childEntityType = TypeHelper.parameterizedType( ChildEntity.class, ChildEntity.class.getTypeParameters() ); + + assertTrue( TypeHelper.isAssignable( parentEntityType, childEntityType ) ); + } + private static void assertAsymmetricallyAssignable(Type supertype, Type type) { assertAssignable( supertype, type ); assertUnassignable( type, supertype );