diff --git a/src/main/java/org/springframework/hateoas/server/core/WebHandler.java b/src/main/java/org/springframework/hateoas/server/core/WebHandler.java index 630a717b..961cb072 100644 --- a/src/main/java/org/springframework/hateoas/server/core/WebHandler.java +++ b/src/main/java/org/springframework/hateoas/server/core/WebHandler.java @@ -32,6 +32,7 @@ import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.function.BiFunction; import java.util.function.Function; @@ -370,10 +371,12 @@ public class WebHandler { Assert.notNull(parameter, "MethodParameter must not be null!"); + boolean isOptionalWrapper = Optional.class.isAssignableFrom(parameter.getParameterType()); + this.parameter = parameter; this.value = value; this.attribute = attribute; - this.parameterTypeDescriptor = TypeDescriptor.nested(parameter, parameter.isOptional() ? 1 : 0); + this.parameterTypeDescriptor = TypeDescriptor.nested(parameter, isOptionalWrapper ? 1 : 0); } /** diff --git a/src/test/java/org/springframework/hateoas/server/mvc/WebMvcLinkBuilderUnitTest.java b/src/test/java/org/springframework/hateoas/server/mvc/WebMvcLinkBuilderUnitTest.java index dad64609..f988d6cf 100644 --- a/src/test/java/org/springframework/hateoas/server/mvc/WebMvcLinkBuilderUnitTest.java +++ b/src/test/java/org/springframework/hateoas/server/mvc/WebMvcLinkBuilderUnitTest.java @@ -521,7 +521,8 @@ class WebMvcLinkBuilderUnitTest extends TestUtils { Link link = linkTo(methodOn(ControllerWithMethods.class).methodForNextPage("1", null, 5)).withSelfRel(); - assertThat(link.getVariables()).containsExactly(new TemplateVariable("offset", VariableType.REQUEST_PARAM_CONTINUED)); + assertThat(link.getVariables()) + .containsExactly(new TemplateVariable("offset", VariableType.REQUEST_PARAM_CONTINUED)); UriComponents components = toComponents(link); @@ -601,6 +602,18 @@ class WebMvcLinkBuilderUnitTest extends TestUtils { assertThat(link.getHref()).isEqualTo("http://localhost/something/bar/foo"); } + /** + * @see #1003, #122, #169 + */ + @Test + void appendsOptionalParameterIfSet() { + + Link link = linkTo(methodOn(ControllerWithMethods.class).methodForOptionalNextPage(1)).withSelfRel(); + + assertThat(link.getVariables()).isEmpty(); + assertThat(link.expand().getHref()).endsWith("/foo?offset=1"); + } + private static UriComponents toComponents(Link link) { return UriComponentsBuilder.fromUriString(link.expand().getHref()).build(); }