From 8a87f08525376163060e87b12967aef18ecf152c Mon Sep 17 00:00:00 2001 From: Oleg Zhurakousky Date: Mon, 21 Sep 2020 15:22:21 +0200 Subject: [PATCH] GH-578 Fix FunctionRegistration lookup The root of the issue was in implementation of equals() and hashCode() of FunctionInvocationWrapper Resolves #578 --- .../function/context/catalog/FunctionInspector.java | 10 ++++++---- .../context/catalog/SimpleFunctionRegistry.java | 10 ++++++++++ .../cloud/function/web/mvc/RoutingFunctionTests.java | 6 ++++++ 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/catalog/FunctionInspector.java b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/catalog/FunctionInspector.java index 3787caaca..62627f395 100644 --- a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/catalog/FunctionInspector.java +++ b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/catalog/FunctionInspector.java @@ -20,7 +20,6 @@ import java.util.Collections; import java.util.Set; import org.springframework.cloud.function.context.FunctionRegistration; -import org.springframework.cloud.function.context.catalog.SimpleFunctionRegistry.FunctionInvocationWrapper; import org.springframework.cloud.function.context.config.RoutingFunction; /** @@ -33,9 +32,12 @@ public interface FunctionInspector { default boolean isMessage(Object function) { FunctionRegistration registration = getRegistration(function); - if (registration != null && registration.getTarget() instanceof FunctionInvocationWrapper - && ((FunctionInvocationWrapper) registration.getTarget()).getTarget() instanceof RoutingFunction) { - // we always want to give routing function as much information as possible +// if (registration != null && registration.getTarget() instanceof FunctionInvocationWrapper +// && ((FunctionInvocationWrapper) registration.getTarget()).getTarget() instanceof RoutingFunction) { +// // we always want to give routing function as much information as possible +// return true; +// } + if (registration != null && registration.getTarget() instanceof RoutingFunction) { return true; } return registration == null ? false : registration.getType().isMessage(); diff --git a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/catalog/SimpleFunctionRegistry.java b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/catalog/SimpleFunctionRegistry.java index 20bb8e58c..8daf02697 100644 --- a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/catalog/SimpleFunctionRegistry.java +++ b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/catalog/SimpleFunctionRegistry.java @@ -427,6 +427,16 @@ public class SimpleFunctionRegistry implements FunctionRegistry, FunctionInspect this.headersField.setAccessible(true); } + @Override + public int hashCode() { + return this.target.hashCode(); + } + + @Override + public boolean equals(Object o) { + return this.target.equals(o); + } + public String getFunctionDefinition() { return this.functionDefinition; } diff --git a/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/mvc/RoutingFunctionTests.java b/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/mvc/RoutingFunctionTests.java index b55c49257..b614a2631 100644 --- a/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/mvc/RoutingFunctionTests.java +++ b/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/mvc/RoutingFunctionTests.java @@ -92,6 +92,12 @@ public class RoutingFunctionTests { .contentType(MediaType.TEXT_PLAIN) .header("spring.cloud.function.definition", "echo") .body("{\"name\":\"Bob\",\"age\":25}"), String.class); + postForEntity = this.rest + .exchange(RequestEntity.post(new URI("/functions/" + RoutingFunction.FUNCTION_NAME)) + .contentType(MediaType.TEXT_PLAIN) + .header("spring.cloud.function.definition", "echo") + .body("{\"name\":\"Bob\",\"age\":25}"), String.class); + assertThat(postForEntity.getBody()).isEqualTo("{\"name\":\"Bob\",\"age\":25}"); assertThat(postForEntity.getStatusCode()).isEqualTo(HttpStatus.OK); }