Skip to content

Commit 67b61fc

Browse files
olegzapp
authored and
app
committed
spring-cloudGH-1139 Fix function composition with non-existing functions
Resolves spring-cloud#1139
1 parent b5466c1 commit 67b61fc

File tree

2 files changed

+29
-3
lines changed

2 files changed

+29
-3
lines changed

spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/catalog/BeanFactoryAwareFunctionRegistry.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -144,11 +144,12 @@ public <T> T lookup(Class<?> type, String functionDefinition, String... expected
144144
Set<String> functionRegistratioinNames = super.getNames(null);
145145
String[] functionNames = StringUtils.delimitedListToStringArray(functionDefinition.replaceAll(",", "|").trim(), "|");
146146
for (String functionName : functionNames) {
147-
if (functionRegistratioinNames.contains(functionName) && logger.isDebugEnabled()) {
148-
logger.debug("Skipping function '" + functionName + "' since it is already present");
147+
if (functionRegistratioinNames.contains(functionName)) {
148+
if (logger.isDebugEnabled()) {
149+
logger.debug("Skipping function '" + functionName + "' since it is already present");
150+
}
149151
}
150152
else {
151-
152153
Object functionCandidate = this.discoverFunctionInBeanFactory(functionName);
153154
if (functionCandidate != null) {
154155
Type functionType = null;

spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/catalog/BeanFactoryAwareFunctionRegistryTests.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import java.util.List;
3030
import java.util.Map;
3131
import java.util.Map.Entry;
32+
import java.util.Set;
3233
import java.util.concurrent.ExecutorService;
3334
import java.util.concurrent.Executors;
3435
import java.util.concurrent.TimeUnit;
@@ -114,6 +115,30 @@ public void testEmptyPojoConversion() {
114115
assertThat(result).isEqualTo("{}");
115116
}
116117

118+
@SuppressWarnings({ "rawtypes", "unchecked" })
119+
@Test
120+
public void testCompositionWithNonExistingFunction() throws Exception {
121+
FunctionCatalog catalog = this.configureCatalog(CompositionWithNullReturnInBetween.class);
122+
for (int i = 0; i < 10; i++) {
123+
catalog.lookup("echo1|any");
124+
}
125+
Field functionRegistrationsField = ReflectionUtils.findField(catalog.getClass(), "functionRegistrations");
126+
functionRegistrationsField.setAccessible(true);
127+
Set<FunctionRegistration> functionRegistrations = (Set) functionRegistrationsField.get(catalog);
128+
assertThat(functionRegistrations.size()).isEqualTo(1);
129+
FunctionRegistration registration = functionRegistrations.iterator().next();
130+
assertThat(registration.getNames().size()).isEqualTo(1);
131+
assertThat(registration.getNames().iterator().next()).isEqualTo("echo1");
132+
133+
for (int i = 0; i < 10; i++) {
134+
catalog.lookup("echo1|any|foo|bar|bye");
135+
}
136+
assertThat(functionRegistrations.size()).isEqualTo(1);
137+
registration = functionRegistrations.iterator().next();
138+
assertThat(registration.getNames().size()).isEqualTo(1);
139+
assertThat(registration.getNames().iterator().next()).isEqualTo("echo1");
140+
}
141+
117142
@SuppressWarnings({ "rawtypes", "unchecked" })
118143
@Test
119144
public void testCompositionWithNullReturnInBetween() {

0 commit comments

Comments
 (0)