Skip to content

Commit

Permalink
Update HandlerMethod#createWithResolvedBean
Browse files Browse the repository at this point in the history
Avoid re-creating the instance unless it is a bean name that
needs to be resolved through the BeanFactory.

Closes gh-34277
  • Loading branch information
rstoyanchev committed Jan 28, 2025
1 parent 1cc767e commit 9b58df8
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 8 deletions.
Original file line number Diff line number Diff line change
@@ -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.
Expand Down Expand Up @@ -317,15 +317,19 @@ public HandlerMethod createWithValidateFlags() {
}

/**
* 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);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -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.
Expand Down Expand Up @@ -72,6 +72,13 @@ void classLevelValidatedAnnotation() {
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);
Expand Down

0 comments on commit 9b58df8

Please sign in to comment.