From 7559b0ce123a0b16347e1e591d50de8261df9a6e Mon Sep 17 00:00:00 2001 From: Oleg Zhurakousky Date: Tue, 9 Jul 2019 16:35:06 +0200 Subject: [PATCH] GH-386 Fixed NPE for non-existing functions invoked as REST endpoints Resolves #386 --- .../cloud/function/web/RequestProcessor.java | 6 +++++- .../function/FunctionEndpointInitializerTests.java | 12 ++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/RequestProcessor.java b/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/RequestProcessor.java index d433a6f02..da1426236 100644 --- a/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/RequestProcessor.java +++ b/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/RequestProcessor.java @@ -233,7 +233,11 @@ public class RequestProcessor { } Mono> responseEntityMono = null; - if (function instanceof FluxedConsumer || function instanceof FluxConsumer) { + if (function == null) { + responseEntityMono = Mono.just(ResponseEntity.status(HttpStatus.NOT_FOUND) + .body("Function for provided path can not be found")); + } + else if (function instanceof FluxedConsumer || function instanceof FluxConsumer) { ((Mono) function.apply(flux)).subscribe(); logger.debug("Handled POST with consumer"); responseEntityMono = Mono diff --git a/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/function/FunctionEndpointInitializerTests.java b/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/function/FunctionEndpointInitializerTests.java index af144c951..48d204c3a 100644 --- a/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/function/FunctionEndpointInitializerTests.java +++ b/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/function/FunctionEndpointInitializerTests.java @@ -30,6 +30,7 @@ import org.springframework.cloud.function.context.FunctionType; import org.springframework.cloud.function.context.FunctionalSpringApplication; import org.springframework.context.ApplicationContextInitializer; import org.springframework.context.support.GenericApplicationContext; +import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.util.SocketUtils; @@ -54,6 +55,17 @@ public class FunctionEndpointInitializerTests { System.clearProperty("server.port"); } + @Test + public void testNonExistingFunction() throws Exception { + FunctionalSpringApplication.run(ApplicationConfiguration.class); + TestRestTemplate testRestTemplate = new TestRestTemplate(); + String port = System.getProperty("server.port"); + Thread.sleep(200); + ResponseEntity response = testRestTemplate + .postForEntity(new URI("http://localhost:" + port + "/foo"), "stressed", String.class); + assertThat(response.getStatusCode()).isEqualTo(HttpStatus.NOT_FOUND); + } + @Test public void testSingleFunctionMapping() throws Exception { FunctionalSpringApplication.run(ApplicationConfiguration.class);