diff --git a/spring-cloud-function-context/pom.xml b/spring-cloud-function-context/pom.xml
index 683aadd71..8722712d9 100644
--- a/spring-cloud-function-context/pom.xml
+++ b/spring-cloud-function-context/pom.xml
@@ -24,6 +24,10 @@
spring-cloud-function-core
${spring-cloud-function.version}
+
+ org.springframework
+ spring-web
+
com.fasterxml.jackson.core
jackson-databind
@@ -33,5 +37,10 @@
spring-boot-configuration-processor
true
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
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 9b1f503a6..b4effd5fb 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
@@ -19,9 +19,12 @@ package org.springframework.cloud.function.context;
import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
+import java.util.Arrays;
+import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
+import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Set;
import java.util.function.Consumer;
@@ -32,6 +35,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
@@ -48,6 +52,7 @@ import org.springframework.cloud.function.support.FunctionUtils;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.ResolvableType;
+import org.springframework.core.annotation.AnnotatedElementUtils;
import org.springframework.core.type.StandardMethodMetadata;
import org.springframework.stereotype.Component;
import org.springframework.util.ClassUtils;
@@ -73,12 +78,14 @@ public class ContextFunctionCatalogAutoConfiguration {
@Autowired(required = false)
private Map> consumers = Collections.emptyMap();
+ @Autowired(required = false)
+ private Map> registrations = Collections.emptyMap();
+
@Bean
public FunctionCatalog functionCatalog(ContextFunctionPostProcessor processor,
ObjectMapper mapper) {
- return new InMemoryFunctionCatalog(processor.wrapSuppliers(mapper, suppliers),
- processor.wrapFunctions(mapper, functions),
- processor.wrapConsumers(mapper, consumers));
+ return new InMemoryFunctionCatalog(
+ processor.merge(registrations, consumers, suppliers, functions, mapper));
}
@Component
@@ -96,17 +103,101 @@ public class ContextFunctionCatalogAutoConfiguration {
this.registry = registry;
}
- public Map> wrapSuppliers(ObjectMapper mapper,
- Map> suppliers) {
- Map> result = new HashMap<>();
- for (String key : suppliers.keySet()) {
- Supplier> target = target(suppliers.get(key), mapper, key);
- result.put(key, target);
- for (String name : registry.getAliases(key)) {
- result.put(name, target);
+ public Set> merge(
+ Map> initial,
+ Map> consumers, Map> suppliers,
+ Map> functions, ObjectMapper mapper) {
+ Set> registrations = new HashSet<>();
+ Map