diff --git a/spring-web/src/main/java/org/springframework/web/method/HandlerMethod.java b/spring-web/src/main/java/org/springframework/web/method/HandlerMethod.java index 2f0042999dd..32423044ed3 100644 --- a/spring-web/src/main/java/org/springframework/web/method/HandlerMethod.java +++ b/spring-web/src/main/java/org/springframework/web/method/HandlerMethod.java @@ -96,6 +96,8 @@ public class HandlerMethod extends AnnotatedMethod { @Nullable private HandlerMethod resolvedFromHandlerMethod; + private @Nullable HandlerMethod resolvedBeanHandlerMethod; + private final String description; @@ -305,8 +307,10 @@ public class HandlerMethod extends AnnotatedMethod { } /** - * Return the HandlerMethod from which this HandlerMethod instance was - * resolved via {@link #createWithResolvedBean()}. + * Return the original HandlerMethod instance that from which the current + * HandlerMethod instance was created via either + * {@link #createWithValidateFlags()} or {@link #createWithResolvedBean()}. + * The original instance is needed for cached CORS config lookups. */ @Nullable public HandlerMethod getResolvedFromHandlerMethod() { @@ -330,6 +334,10 @@ public class HandlerMethod extends AnnotatedMethod { *
If the {@link #getBean() handler} is not String, return the same instance. */ public HandlerMethod createWithResolvedBean() { + if (this.resolvedBeanHandlerMethod != null) { + return this.resolvedBeanHandlerMethod; + } + if (!(this.bean instanceof String beanName)) { return this; } @@ -337,7 +345,13 @@ public class HandlerMethod extends AnnotatedMethod { Assert.state(this.beanFactory != null, "Cannot resolve bean name without BeanFactory"); Object handler = this.beanFactory.getBean(beanName); Assert.notNull(handler, "No handler instance"); - return new HandlerMethod(this, handler, false); + + HandlerMethod handlerMethod = new HandlerMethod(this, handler, false); + if (this.beanFactory.isSingleton(beanName)) { + this.resolvedBeanHandlerMethod = handlerMethod; + } + + return handlerMethod; } /**