From a21b27e6d924e5be356d337ad374e007469ccbda Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Wed, 29 Jun 2022 17:01:04 +0200 Subject: [PATCH] Use isAssignableValue instead of isInstanceOf for argument resolution Includes related nullability refinements. Closes gh-28727 --- .../beans/factory/aot/AutowiredArguments.java | 15 ++++++++++----- .../AbstractAutowireCapableBeanFactory.java | 1 + 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/aot/AutowiredArguments.java b/spring-beans/src/main/java/org/springframework/beans/factory/aot/AutowiredArguments.java index d07af723967..14178b512d9 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/aot/AutowiredArguments.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/aot/AutowiredArguments.java @@ -18,6 +18,7 @@ package org.springframework.beans.factory.aot; import org.springframework.lang.Nullable; import org.springframework.util.Assert; +import org.springframework.util.ClassUtils; /** * Resolved arguments to be autowired. @@ -38,11 +39,14 @@ public interface AutowiredArguments { * @param requiredType the required argument type * @return the argument */ - @Nullable @SuppressWarnings("unchecked") + @Nullable default T get(int index, Class requiredType) { - Object value = get(index); - Assert.isInstanceOf(requiredType, value); + Object value = getObject(index); + if (!ClassUtils.isAssignableValue(requiredType, value)) { + throw new IllegalArgumentException("Argument type mismatch: expected '" + + ClassUtils.getQualifiedName(requiredType) + "' for value [" + value + "]"); + } return (T) value; } @@ -52,10 +56,10 @@ public interface AutowiredArguments { * @param index the argument index * @return the argument */ - @Nullable @SuppressWarnings("unchecked") + @Nullable default T get(int index) { - return (T) toArray()[index]; + return (T) getObject(index); } /** @@ -63,6 +67,7 @@ public interface AutowiredArguments { * @param index the argument index * @return the argument */ + @Nullable default Object getObject(int index) { return toArray()[index]; } diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractAutowireCapableBeanFactory.java b/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractAutowireCapableBeanFactory.java index b063124ace1..fdc54df68d4 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractAutowireCapableBeanFactory.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractAutowireCapableBeanFactory.java @@ -1215,6 +1215,7 @@ public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFac return bw; } + @Nullable private Object obtainInstanceFromSupplier(Supplier supplier, String beanName) { String outerBean = this.currentlyCreatedBean.get(); this.currentlyCreatedBean.set(beanName);