From 16af183df29ac4f1bdf4203edd1529ace39ebe2e Mon Sep 17 00:00:00 2001 From: Oleg Zhurakousky Date: Fri, 22 Nov 2019 13:05:07 +0100 Subject: [PATCH] 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 --- .../cloud/stream/function/FunctionConfiguration.java | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/function/FunctionConfiguration.java b/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/function/FunctionConfiguration.java index f715609a1..329d71d13 100644 --- a/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/function/FunctionConfiguration.java +++ b/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/function/FunctionConfiguration.java @@ -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); } }