diff --git a/src/main/java/org/springframework/hateoas/UriTemplate.java b/src/main/java/org/springframework/hateoas/UriTemplate.java index c41f0cdb..e899a345 100644 --- a/src/main/java/org/springframework/hateoas/UriTemplate.java +++ b/src/main/java/org/springframework/hateoas/UriTemplate.java @@ -244,8 +244,7 @@ public class UriTemplate implements Iterable, Serializable { return URI.create(baseUri); } - org.springframework.web.util.UriTemplate baseTemplate = new org.springframework.web.util.UriTemplate(baseUri); - UriComponentsBuilder builder = UriComponentsBuilder.fromUri(baseTemplate.expand(parameters)); + UriComponentsBuilder builder = UriComponentsBuilder.fromUriString(baseUri); Iterator iterator = Arrays.asList(parameters).iterator(); for (TemplateVariable variable : getOptionalVariables()) { @@ -254,7 +253,7 @@ public class UriTemplate implements Iterable, Serializable { appendToBuilder(builder, variable, value); } - return builder.build().toUri(); + return builder.buildAndExpand(parameters).toUri(); } /** @@ -265,20 +264,19 @@ public class UriTemplate implements Iterable, Serializable { */ public URI expand(Map parameters) { + Assert.notNull(parameters, "Parameters must not be null!"); + if (TemplateVariables.NONE.equals(variables)) { return URI.create(baseUri); } - Assert.notNull(parameters, "Parameters must not be null!"); - - org.springframework.web.util.UriTemplate baseTemplate = new org.springframework.web.util.UriTemplate(baseUri); - UriComponentsBuilder builder = UriComponentsBuilder.fromUri(baseTemplate.expand(parameters)); + UriComponentsBuilder builder = UriComponentsBuilder.fromUriString(baseUri); for (TemplateVariable variable : getOptionalVariables()) { appendToBuilder(builder, variable, parameters.get(variable.getName())); } - return builder.build().toUri(); + return builder.buildAndExpand(parameters).toUri(); } /* diff --git a/src/test/java/org/springframework/hateoas/UriTemplateUnitTest.java b/src/test/java/org/springframework/hateoas/UriTemplateUnitTest.java index 7a299e2d..441003bd 100755 --- a/src/test/java/org/springframework/hateoas/UriTemplateUnitTest.java +++ b/src/test/java/org/springframework/hateoas/UriTemplateUnitTest.java @@ -342,6 +342,13 @@ class UriTemplateUnitTest { assertThat(expandedTemplate).isEqualTo("/foo?bar=barExpanded&foobar=singleValue"); } + @Test // #1127 + void escapesBaseUriProperly() { + + assertThat(UriTemplate.of("https://example.org/foo and bar/{baz}").expand("xyzzy")) + .hasToString("https://example.org/foo%20and%20bar/xyzzy"); + } + private static void assertVariables(UriTemplate template, TemplateVariable... variables) { assertVariables(template, Arrays.asList(variables)); }