From a012159f2ecd508a3f236f9c6066a115008fc529 Mon Sep 17 00:00:00 2001 From: Oliver Drotbohm Date: Tue, 16 Feb 2021 12:52:24 +0100 Subject: [PATCH] #1469 - 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 2fa4a263..f9f13251 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; /** @@ -42,8 +42,6 @@ import org.springframework.web.bind.annotation.RequestMethod; @Deprecated public class AnnotationMappingDiscoverer implements MappingDiscoverer { - private static final Pattern MULTIPLE_SLASHES = Pattern.compile("/{2,}"); - private final Class annotationType; private final String mappingAttributeName; @@ -195,6 +193,10 @@ public class AnnotationMappingDiscoverer implements MappingDiscoverer { String part = parts[i]; + if (!StringUtils.hasText(part)) { + continue; + } + if (i != 0) { result.append("/"); } @@ -202,7 +204,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 3261957b..c881d928 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 // #1469 + 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(); } + + // #1469 + + interface TrailingSlashes { + + @RequestMapping("/api/myentities/") + Object trailingSlash(); + } }