From c141896af740dcc2fef1e242f64dff8ed41b6981 Mon Sep 17 00:00:00 2001 From: Oliver Drotbohm Date: Tue, 16 Feb 2021 12:52:24 +0100 Subject: [PATCH] #1470 - Mapping discoverer now keeps trailing slashes around. --- .../server/core/AnnotationMappingDiscoverer.java | 10 ++++++---- .../AnnotationMappingDiscovererUnitTest.java | 16 ++++++++++++++++ 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/springframework/hateoas/server/core/AnnotationMappingDiscoverer.java b/src/main/java/org/springframework/hateoas/server/core/AnnotationMappingDiscoverer.java index 481bc3ed..206b3deb 100644 --- a/src/main/java/org/springframework/hateoas/server/core/AnnotationMappingDiscoverer.java +++ b/src/main/java/org/springframework/hateoas/server/core/AnnotationMappingDiscoverer.java @@ -24,11 +24,11 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; -import java.util.regex.Pattern; import org.springframework.http.HttpMethod; import org.springframework.lang.Nullable; import org.springframework.util.Assert; +import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.RequestMethod; /** @@ -40,8 +40,6 @@ import org.springframework.web.bind.annotation.RequestMethod; */ public class AnnotationMappingDiscoverer implements MappingDiscoverer { - private static final Pattern MULTIPLE_SLASHES = Pattern.compile("/{2,}"); - private final Class annotationType; private final String mappingAttributeName; @@ -193,6 +191,10 @@ public class AnnotationMappingDiscoverer implements MappingDiscoverer { String part = parts[i]; + if (!StringUtils.hasText(part)) { + continue; + } + if (i != 0) { result.append("/"); } @@ -200,7 +202,7 @@ public class AnnotationMappingDiscoverer implements MappingDiscoverer { result.append(part.contains(":") ? cleanupPart(part) : part); } - return MULTIPLE_SLASHES.matcher(result.toString()).replaceAll("/"); + return (mapping.endsWith("/") ? result.append("/") : result).toString(); } private static String cleanupPart(String part) { diff --git a/src/test/java/org/springframework/hateoas/server/core/AnnotationMappingDiscovererUnitTest.java b/src/test/java/org/springframework/hateoas/server/core/AnnotationMappingDiscovererUnitTest.java index 9702ab58..9982bab9 100755 --- a/src/test/java/org/springframework/hateoas/server/core/AnnotationMappingDiscovererUnitTest.java +++ b/src/test/java/org/springframework/hateoas/server/core/AnnotationMappingDiscovererUnitTest.java @@ -168,6 +168,14 @@ class AnnotationMappingDiscovererUnitTest { assertThat(discoverer.getMapping(method)).isEqualTo("/type/spring-web/{symbolicName}-{version}{extension}"); } + @Test // #1470 + void keepsTrailingSlash() throws Exception { + + Method method = TrailingSlashes.class.getMethod("trailingSlash"); + + assertThat(discoverer.getMapping(method)).isEqualTo("/api/myentities/"); + } + @RequestMapping("/type") interface MyController { @@ -253,4 +261,12 @@ class AnnotationMappingDiscovererUnitTest { @RequestMapping({ "/method", "/methodAlias" }) void method(); } + + // #1470 + + interface TrailingSlashes { + + @RequestMapping("/api/myentities/") + Object trailingSlash(); + } }