From 260404b7f2605b070aa5262e7f78b9b06a430bf0 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Sat, 24 Feb 2024 20:25:56 +0100 Subject: [PATCH] Consistently detect wildcard without bounds as unresolvable Closes gh-32327 See gh-20727 --- .../springframework/core/ResolvableType.java | 2 +- .../core/ResolvableTypeTests.java | 18 +++++++++++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/spring-core/src/main/java/org/springframework/core/ResolvableType.java b/spring-core/src/main/java/org/springframework/core/ResolvableType.java index 485dbdf1e0..f4b9a0ce58 100644 --- a/spring-core/src/main/java/org/springframework/core/ResolvableType.java +++ b/spring-core/src/main/java/org/springframework/core/ResolvableType.java @@ -325,7 +325,7 @@ public class ResolvableType implements Serializable { other.getComponentType(), true, matchedBefore, upUntilUnresolvable)); } - if (upUntilUnresolvable && other.isUnresolvableTypeVariable()) { + if (upUntilUnresolvable && (other.isUnresolvableTypeVariable() || other.isWildcardWithoutBounds())) { return true; } diff --git a/spring-core/src/test/java/org/springframework/core/ResolvableTypeTests.java b/spring-core/src/test/java/org/springframework/core/ResolvableTypeTests.java index b4b55c9a56..d27f207011 100644 --- a/spring-core/src/test/java/org/springframework/core/ResolvableTypeTests.java +++ b/spring-core/src/test/java/org/springframework/core/ResolvableTypeTests.java @@ -1367,6 +1367,18 @@ class ResolvableTypeTests { assertThat(type.resolveGeneric()).isEqualTo(Integer.class); } + @Test + void gh32327() throws Exception { + ResolvableType repository1 = ResolvableType.forField(Fields.class.getField("repository")); + ResolvableType repository2 = ResolvableType.forMethodReturnType(Methods.class.getMethod("repository")); + assertThat(repository1.hasUnresolvableGenerics()); + assertThat(repository1.isAssignableFrom(repository2)).isFalse(); + assertThat(repository1.isAssignableFromResolvedPart(repository2)).isTrue(); + assertThat(repository2.hasUnresolvableGenerics()); + assertThat(repository2.isAssignableFrom(repository1)).isTrue(); + assertThat(repository2.isAssignableFromResolvedPart(repository1)).isTrue(); + } + private ResolvableType testSerialization(ResolvableType type) throws Exception { ByteArrayOutputStream bos = new ByteArrayOutputStream(); @@ -1407,7 +1419,7 @@ class ResolvableTypeTests { } - interface SomeRepository { + interface SomeRepository { T someMethod(Class arg0, Class arg1, Class arg2); } @@ -1458,6 +1470,8 @@ class ResolvableTypeTests { public Integer[] integerArray; public int[] intArray; + + public SomeRepository repository; } @@ -1486,6 +1500,8 @@ class ResolvableTypeTests { List list1(); List list2(); + + SomeRepository repository(); }