diff --git a/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/flux/FunctionHandlerMapping.java b/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/flux/FunctionHandlerMapping.java index 3c9f03edf..1db849443 100644 --- a/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/flux/FunctionHandlerMapping.java +++ b/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/flux/FunctionHandlerMapping.java @@ -30,6 +30,7 @@ import org.springframework.cloud.function.context.FunctionInspector; import org.springframework.cloud.function.registry.FunctionCatalog; import org.springframework.cloud.function.web.flux.constants.WebRequestConstants; import org.springframework.context.annotation.Configuration; +import org.springframework.util.StringUtils; import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.HandlerMapping; import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; @@ -80,6 +81,9 @@ public class FunctionHandlerMapping extends RequestMappingHandlerMapping } String path = (String) request .getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE); + if (StringUtils.hasText(prefix) && !path.startsWith(prefix)) { + return null; + } if (path.startsWith(prefix)) { path = path.substring(prefix.length()); } diff --git a/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/PrefixTests.java b/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/PrefixTests.java index 8250b6707..606ca54fe 100644 --- a/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/PrefixTests.java +++ b/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/PrefixTests.java @@ -53,12 +53,19 @@ public class PrefixTests { @Test public void words() throws Exception { - ResponseEntity result = rest - .exchange(RequestEntity.get(new URI("/functions/words")).build(), String.class); + ResponseEntity result = rest.exchange( + RequestEntity.get(new URI("/functions/words")).build(), String.class); assertThat(result.getStatusCode()).isEqualTo(HttpStatus.OK); assertThat(result.getBody()).isEqualTo("[\"foo\",\"bar\"]"); } + @Test + public void missing() throws Exception { + ResponseEntity result = rest + .exchange(RequestEntity.get(new URI("/words")).build(), String.class); + assertThat(result.getStatusCode()).isEqualTo(HttpStatus.NOT_FOUND); + } + @EnableAutoConfiguration @org.springframework.boot.test.context.TestConfiguration protected static class TestConfiguration {