Add support for @Component to TypeResolverHelper

This commit is contained in:
Sébastien Deleuze
2024-11-15 17:17:43 +01:00
parent 01fa511339
commit f9734a35aa
3 changed files with 50 additions and 3 deletions

View File

@@ -152,6 +152,16 @@ public abstract class TypeResolverHelper {
rootBeanDefinition.setResolvedFactoryMethod(uniqueCandidate);
return rootBeanDefinition.getResolvableType();
}
// Support for @Component
if (beanDefinition.getFactoryMethodName() == null && beanDefinition.getBeanClassName() != null) {
try {
return ResolvableType.forClass(
ClassUtils.forName(beanDefinition.getBeanClassName(), applicationContext.getClassLoader()));
}
catch (ClassNotFoundException ex) {
throw new IllegalArgumentException("Impossible to resolve the type of bean " + beanName, ex);
}
}
throw new IllegalArgumentException("Impossible to resolve the type of bean " + beanName);
}

View File

@@ -32,14 +32,14 @@ import org.springframework.core.ResolvableType;
import static org.assertj.core.api.Assertions.assertThat;
@SpringBootTest
class TypeResolverHelperIT {
public class TypeResolverHelperIT {
@Autowired
GenericApplicationContext applicationContext;
@ParameterizedTest(name = "{0} : {displayName} ")
@ValueSource(strings = { "weatherClassDefinition", "weatherFunctionDefinition", "standaloneWeatherFunction",
"scannedStandaloneWeatherFunction" })
"scannedStandaloneWeatherFunction", "componentWeatherFunction" })
void beanInputTypeResolutionWithResolvableType(String beanName) {
assertThat(this.applicationContext).isNotNull();
ResolvableType functionType = TypeResolverHelper.resolveBeanType(this.applicationContext, beanName);
@@ -70,7 +70,8 @@ class TypeResolverHelperIT {
}
@Configuration
@ComponentScan("org.springframework.ai.model.function.config")
@ComponentScan({ "org.springframework.ai.model.function.config",
"org.springframework.ai.model.function.component" })
public static class TypeResolverHelperConfiguration {
@Bean

View File

@@ -0,0 +1,36 @@
/*
* Copyright 2023-2024 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.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.ai.model.function.component;
import java.util.function.Function;
import org.springframework.ai.model.function.TypeResolverHelperIT.WeatherRequest;
import org.springframework.ai.model.function.TypeResolverHelperIT.WeatherResponse;
import org.springframework.stereotype.Component;
/**
* @author Sebastien Deleuze
*/
@Component
public class ComponentWeatherFunction implements Function<WeatherRequest, WeatherResponse> {
@Override
public WeatherResponse apply(WeatherRequest weatherRequest) {
return new WeatherResponse(42.0f);
}
}