From cd927e08a438526f814c75fed0d670c21ec4fe46 Mon Sep 17 00:00:00 2001 From: Oliver Drotbohm Date: Tue, 16 Feb 2021 12:52:24 +0100 Subject: [PATCH] #1468 - 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 8aa8ce11..78579c48 100644 --- a/src/main/java/org/springframework/hateoas/server/core/AnnotationMappingDiscoverer.java +++ b/src/main/java/org/springframework/hateoas/server/core/AnnotationMappingDiscoverer.java @@ -25,13 +25,13 @@ import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.List; -import java.util.regex.Pattern; import java.util.stream.Collectors; import org.springframework.http.HttpMethod; import org.springframework.http.MediaType; import org.springframework.lang.Nullable; import org.springframework.util.Assert; +import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.RequestMethod; /** @@ -45,8 +45,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; @@ -213,6 +211,10 @@ public class AnnotationMappingDiscoverer implements MappingDiscoverer { String part = parts[i]; + if (!StringUtils.hasText(part)) { + continue; + } + if (i != 0) { result.append("/"); } @@ -220,7 +222,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 782acfb0..202bf12d 100755 --- a/src/test/java/org/springframework/hateoas/server/core/AnnotationMappingDiscovererUnitTest.java +++ b/src/test/java/org/springframework/hateoas/server/core/AnnotationMappingDiscovererUnitTest.java @@ -179,6 +179,14 @@ class AnnotationMappingDiscovererUnitTest { assertThat(discoverer.getMapping(method)).isEqualTo("/type/spring-web/{symbolicName}-{version}{extension}"); } + @Test // #1468 + void keepsTrailingSlash() throws Exception { + + Method method = TrailingSlashes.class.getMethod("trailingSlash"); + + assertThat(discoverer.getMapping(method)).isEqualTo("/api/myentities/"); + } + @RequestMapping("/type") interface MyController { @@ -267,4 +275,12 @@ class AnnotationMappingDiscovererUnitTest { @RequestMapping({ "/method", "/methodAlias" }) void method(); } + + // #1468 + + interface TrailingSlashes { + + @RequestMapping("/api/myentities/") + Object trailingSlash(); + } }