diff --git a/src/main/java/org/springframework/hateoas/core/LinkBuilderSupport.java b/src/main/java/org/springframework/hateoas/core/LinkBuilderSupport.java index 17b97429..00859174 100644 --- a/src/main/java/org/springframework/hateoas/core/LinkBuilderSupport.java +++ b/src/main/java/org/springframework/hateoas/core/LinkBuilderSupport.java @@ -62,6 +62,10 @@ public abstract class LinkBuilderSupport implements LinkB String path = object.toString(); + if (path.endsWith("#")) { + path = path.substring(0, path.length() - 1); + } + if (!StringUtils.hasText(path)) { return getThis(); } @@ -73,6 +77,11 @@ public abstract class LinkBuilderSupport implements LinkB builder.pathSegment(pathSegment); } + String fragment = components.getFragment(); + if (StringUtils.hasText(fragment)) { + builder.fragment(fragment); + } + return createNewInstance(builder.query(components.getQuery())); } diff --git a/src/test/java/org/springframework/hateoas/core/LinkBuilderSupportUnitTest.java b/src/test/java/org/springframework/hateoas/core/LinkBuilderSupportUnitTest.java index d597f6c7..4561cf30 100644 --- a/src/test/java/org/springframework/hateoas/core/LinkBuilderSupportUnitTest.java +++ b/src/test/java/org/springframework/hateoas/core/LinkBuilderSupportUnitTest.java @@ -36,6 +36,20 @@ public class LinkBuilderSupportUnitTest extends TestUtils { assertThat(builder.slash(""), is(builder)); } + @Test + public void appendsFragmentCorrectly() { + + SampleLinkBuilder builder = new SampleLinkBuilder(UriComponentsBuilder.newInstance()); + builder = builder.slash("foo#bar"); + assertThat(builder.toString(), endsWith("foo#bar")); + builder = builder.slash("bar"); + assertThat(builder.toString(), endsWith("foo/bar#bar")); + builder = builder.slash("#foo"); + assertThat(builder.toString(), endsWith("foo/bar#foo")); + builder = builder.slash("#"); + assertThat(builder.toString(), endsWith("foo/bar#foo")); + } + static class SampleLinkBuilder extends LinkBuilderSupport { public SampleLinkBuilder(UriComponentsBuilder builder) {