From 8459fb4e3036a0897d46d60e0949237ac1cdeb57 Mon Sep 17 00:00:00 2001 From: Dave Syer Date: Mon, 20 Nov 2017 15:34:06 +0000 Subject: [PATCH] Ensure a concrete type with parametrric subtype is detected If user defines their own @Beans from conrete types that implement Function<...> then their type signature is detectable from the class. --- ...ntextFunctionCatalogAutoConfiguration.java | 7 ++++++- ...FunctionCatalogAutoConfigurationTests.java | 20 +++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/ContextFunctionCatalogAutoConfiguration.java b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/ContextFunctionCatalogAutoConfiguration.java index ea5822699..33656eac0 100644 --- a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/ContextFunctionCatalogAutoConfiguration.java +++ b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/ContextFunctionCatalogAutoConfiguration.java @@ -494,9 +494,14 @@ public class ContextFunctionCatalogAutoConfiguration { int index = paramType.isOutput() ? 1 : 0; if (source instanceof StandardMethodMetadata) { // Standard @Bean metadata - ParameterizedType type = (ParameterizedType) ((StandardMethodMetadata) source) + Type beanType = ((StandardMethodMetadata) source) .getIntrospectedMethod().getGenericReturnType(); + if (beanType instanceof ParameterizedType) { + ParameterizedType type = (ParameterizedType) beanType; param = extractType(type, paramType, index); + } else { + param = findTypeFromBeanClass((Class) beanType, paramType); + } } else if (source instanceof MethodMetadataReadingVisitor) { // A component scan with @Beans diff --git a/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/ContextFunctionCatalogAutoConfigurationTests.java b/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/ContextFunctionCatalogAutoConfigurationTests.java index 660104b0a..7256f3de4 100644 --- a/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/ContextFunctionCatalogAutoConfigurationTests.java +++ b/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/ContextFunctionCatalogAutoConfigurationTests.java @@ -211,6 +211,17 @@ public class ContextFunctionCatalogAutoConfigurationTests { .isAssignableFrom(Integer.class); } + @Test + public void nonParametericTypeFunction() { + create(NonParametricTypeSingletonConfiguration.class); + assertThat(context.getBean("function")).isInstanceOf(Function.class); + assertThat(catalog.lookupFunction("function")).isInstanceOf(Function.class); + assertThat(inspector.getInputType(catalog.lookupFunction("function"))) + .isAssignableFrom(Integer.class); + assertThat(inspector.getInputWrapper(catalog.lookupFunction("function"))) + .isAssignableFrom(Integer.class); + } + @Test public void componentScanBeanFunction() { create(ComponentScanBeanConfiguration.class); @@ -487,6 +498,15 @@ public class ContextFunctionCatalogAutoConfigurationTests { } } + @EnableAutoConfiguration + @Configuration + protected static class NonParametricTypeSingletonConfiguration { + @Bean + public SingletonFunction function() { + return new SingletonFunction(); + } + } + protected static class SingletonFunction implements Function { @Override