From 20bc5ef68bae66fd9115faaaa4ccd4c35b7e2fb0 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Tue, 17 Sep 2024 16:20:54 +0200 Subject: [PATCH] Accept nested array type for upUntilUnresolvable check as well Closes gh-33535 --- .../context/annotation/Spr16179Tests.java | 4 ++++ .../springframework/core/ResolvableType.java | 11 +++++----- .../core/ResolvableTypeTests.java | 21 +++++++++++++++++++ 3 files changed, 31 insertions(+), 5 deletions(-) diff --git a/spring-context/src/test/java/org/springframework/context/annotation/Spr16179Tests.java b/spring-context/src/test/java/org/springframework/context/annotation/Spr16179Tests.java index eb9ce351622..302d34086b0 100644 --- a/spring-context/src/test/java/org/springframework/context/annotation/Spr16179Tests.java +++ b/spring-context/src/test/java/org/springframework/context/annotation/Spr16179Tests.java @@ -38,6 +38,7 @@ class Spr16179Tests { assertThat(bf.getBean(AssemblerInjection.class).assembler4).isSameAs(bf.getBean("pageAssembler")); assertThat(bf.getBean(AssemblerInjection.class).assembler5).isSameAs(bf.getBean("pageAssembler")); assertThat(bf.getBean(AssemblerInjection.class).assembler6).isSameAs(bf.getBean("pageAssembler")); + assertThat(bf.getBean(AssemblerInjection.class).assembler7).isSameAs(bf.getBean("pageAssembler")); } } @@ -80,6 +81,9 @@ class Spr16179Tests { @Autowired(required = false) PageAssembler assembler6; + + @Autowired(required = false) + PageAssembler assembler7; } 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 bc76795032e..92cb0bf23d8 100644 --- a/spring-core/src/main/java/org/springframework/core/ResolvableType.java +++ b/spring-core/src/main/java/org/springframework/core/ResolvableType.java @@ -319,17 +319,18 @@ public class ResolvableType implements Serializable { } } + if (upUntilUnresolvable && (other.isUnresolvableTypeVariable() || other.isWildcardWithoutBounds())) { + return true; + } + // Deal with array by delegating to the component type if (isArray()) { return (other.isArray() && getComponentType().isAssignableFrom( other.getComponentType(), true, matchedBefore, upUntilUnresolvable)); } - if (upUntilUnresolvable && (other.isUnresolvableTypeVariable() || other.isWildcardWithoutBounds())) { - return true; - } - - boolean exactMatch = (strict && matchedBefore != null); // We're checking nested generic variables now... + // We're checking nested generic variables now... + boolean exactMatch = (strict && matchedBefore != null); // Deal with wildcard bounds WildcardBounds ourBounds = WildcardBounds.get(this); 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 e2f397528ac..67692325818 100644 --- a/spring-core/src/test/java/org/springframework/core/ResolvableTypeTests.java +++ b/spring-core/src/test/java/org/springframework/core/ResolvableTypeTests.java @@ -1427,6 +1427,23 @@ class ResolvableTypeTests { assertThat(repository3.isAssignableFromResolvedPart(repository1)).isFalse(); } + @Test + void gh33535() throws Exception { + ResolvableType repository1 = ResolvableType.forField(Fields.class.getField("stringRepository")); + ResolvableType repository2 = ResolvableType.forField(Fields.class.getField("arrayRepository")); + ResolvableType repository3 = ResolvableType.forMethodReturnType(Methods.class.getMethod("someRepository")); + assertThat(repository1.hasUnresolvableGenerics()).isFalse(); + assertThat(repository1.isAssignableFrom(repository3)).isFalse(); + assertThat(repository1.isAssignableFromResolvedPart(repository3)).isTrue(); + assertThat(repository3.isAssignableFrom(repository1)).isTrue(); + assertThat(repository3.isAssignableFromResolvedPart(repository1)).isTrue(); + assertThat(repository2.hasUnresolvableGenerics()).isFalse(); + assertThat(repository2.isAssignableFrom(repository3)).isFalse(); + assertThat(repository2.isAssignableFromResolvedPart(repository3)).isTrue(); + assertThat(repository3.isAssignableFrom(repository2)).isTrue(); + assertThat(repository3.isAssignableFromResolvedPart(repository2)).isTrue(); + } + private ResolvableType testSerialization(ResolvableType type) throws Exception { ByteArrayOutputStream bos = new ByteArrayOutputStream(); @@ -1525,6 +1542,10 @@ class ResolvableTypeTests { public int[] intArray; public SomeRepository repository; + + public SomeRepository stringRepository; + + public SomeRepository arrayRepository; }