Browse Source

Update HandlerMethod#createWithResolvedBean

Avoid re-creating the instance unless it is a bean name that
needs to be resolved through the BeanFactory.

Closes gh-34277
pull/34362/head
rstoyanchev 1 year ago
parent
commit
9b58df8857
  1. 18
      spring-web/src/main/java/org/springframework/web/method/HandlerMethod.java
  2. 9
      spring-web/src/test/java/org/springframework/web/method/HandlerMethodTests.java

18
spring-web/src/main/java/org/springframework/web/method/HandlerMethod.java

@ -1,5 +1,5 @@ @@ -1,5 +1,5 @@
/*
* Copyright 2002-2024 the original author or authors.
* Copyright 2002-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -317,15 +317,19 @@ public class HandlerMethod extends AnnotatedMethod { @@ -317,15 +317,19 @@ public class HandlerMethod extends AnnotatedMethod {
}
/**
* If the provided instance contains a bean name rather than an object instance,
* the bean name is resolved before a {@link HandlerMethod} is created and returned.
* If the {@link #getBean() handler} is a bean name rather than the actual
* handler instance, resolve the bean name through Spring configuration
* (e.g. for prototype beans), and return a new {@link HandlerMethod}
* instance with the resolved handler.
* <p>If the {@link #getBean() handler} is not String, return the same instance.
*/
public HandlerMethod createWithResolvedBean() {
Object handler = this.bean;
if (this.bean instanceof String beanName) {
Assert.state(this.beanFactory != null, "Cannot resolve bean name without BeanFactory");
handler = this.beanFactory.getBean(beanName);
if (!(this.bean instanceof String beanName)) {
return this;
}
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);
}

9
spring-web/src/test/java/org/springframework/web/method/HandlerMethodTests.java

@ -1,5 +1,5 @@ @@ -1,5 +1,5 @@
/*
* Copyright 2002-2024 the original author or authors.
* Copyright 2002-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -72,6 +72,13 @@ class HandlerMethodTests { @@ -72,6 +72,13 @@ class HandlerMethodTests {
testValidateReturnValue(target, List.of("getPerson"), false);
}
@Test // gh-34277
void createWithResolvedBeanSameInstance() {
MyClass target = new MyClass();
HandlerMethod handlerMethod = getHandlerMethod(target, "addPerson");
assertThat(handlerMethod.createWithResolvedBean()).isSameAs(handlerMethod);
}
private static void testValidateArgs(Object target, List<String> methodNames, boolean expected) {
for (String methodName : methodNames) {
assertThat(getHandlerMethod(target, methodName).shouldValidateArguments()).isEqualTo(expected);

Loading…
Cancel
Save