GH-1845 Fix ClassCast Exception when retrieving bean definition

During search for PollableBean we assumed that the underlying supplier definition is RootBeanDefinition which is not always the case

Resolves #1845
This commit is contained in:
Oleg Zhurakousky
2019-11-22 13:05:07 +01:00
parent 8a1c4acb1c
commit 16af183df2

View File

@@ -41,6 +41,7 @@ import reactor.util.function.Tuples;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
@@ -242,13 +243,17 @@ public class FunctionConfiguration {
// here we need to ensure that for cases where composition is defined we only look for supplier method to find Pollable annotation.
String supplierFunctionName = StringUtils
.delimitedListToStringArray(proxyFactory.getFunctionDefinition().replaceAll(",", "|").trim(), "|")[0];
RootBeanDefinition bd = (RootBeanDefinition) context.getBeanDefinition(supplierFunctionName);
Method factoryMethod = bd.getResolvedFactoryMethod();
BeanDefinition bd = context.getBeanDefinition(supplierFunctionName);
if (!(bd instanceof RootBeanDefinition)) {
return null;
}
Method factoryMethod = ((RootBeanDefinition) bd).getResolvedFactoryMethod();
if (factoryMethod == null) {
Object source = bd.getSource();
if (source instanceof MethodMetadata) {
Class<?> factory = ClassUtils.resolveClassName(((MethodMetadata) source).getDeclaringClassName(), null);
Class<?>[] params = FunctionContextUtils.getParamTypesFromBeanDefinitionFactory(factory, bd);
Class<?>[] params = FunctionContextUtils.getParamTypesFromBeanDefinitionFactory(factory, (RootBeanDefinition) bd);
factoryMethod = ReflectionUtils.findMethod(factory, ((MethodMetadata) source).getMethodName(), params);
}
}