From 5faf9858bbbf8d0bbb8f423bd90cdabc479e0c57 Mon Sep 17 00:00:00 2001 From: Greg Turnquist Date: Fri, 1 Sep 2017 16:09:41 -0500 Subject: [PATCH] #617 - AnnotatedParametersParameterAccessor now considers @AliasFor declarations. We're now using SynthesizingMethodParameter to correctly support annotation attributes that use @AliasFor. Original pull request: #621. --- .../hateoas/core/MethodParameters.java | 3 ++- .../mvc/ControllerLinkBuilderUnitTest.java | 15 ++++++++++++++ .../mvc/DummyInvocationUtilsUnitTest.java | 20 +++++++++++++++++-- 3 files changed, 35 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/springframework/hateoas/core/MethodParameters.java b/src/main/java/org/springframework/hateoas/core/MethodParameters.java index 4dd551e9..cd9e0f69 100644 --- a/src/main/java/org/springframework/hateoas/core/MethodParameters.java +++ b/src/main/java/org/springframework/hateoas/core/MethodParameters.java @@ -24,6 +24,7 @@ import java.util.Map; import org.springframework.core.DefaultParameterNameDiscoverer; import org.springframework.core.MethodParameter; import org.springframework.core.ParameterNameDiscoverer; +import org.springframework.core.annotation.SynthesizingMethodParameter; import org.springframework.util.Assert; import org.springframework.util.ConcurrentReferenceHashMap; @@ -151,7 +152,7 @@ public class MethodParameters { * * @author Oliver Gierke */ - private static class AnnotationNamingMethodParameter extends MethodParameter { + private static class AnnotationNamingMethodParameter extends SynthesizingMethodParameter { private final AnnotationAttribute attribute; private String name; diff --git a/src/test/java/org/springframework/hateoas/mvc/ControllerLinkBuilderUnitTest.java b/src/test/java/org/springframework/hateoas/mvc/ControllerLinkBuilderUnitTest.java index b5a09f3a..813ac744 100644 --- a/src/test/java/org/springframework/hateoas/mvc/ControllerLinkBuilderUnitTest.java +++ b/src/test/java/org/springframework/hateoas/mvc/ControllerLinkBuilderUnitTest.java @@ -580,6 +580,16 @@ public class ControllerLinkBuilderUnitTest extends TestUtils { assertThat(link.getHref(), endsWith("?value=1")); } + /** + * @see #617 + */ + @Test + public void alternativePathVariableParameter() { + + Link link = linkTo(methodOn(ControllerWithMethods.class).methodWithAlternatePathVariable("bar")).withSelfRel(); + assertThat(link.getHref(), is("http://localhost/something/bar/foo")); + } + private static UriComponents toComponents(Link link) { return UriComponentsBuilder.fromUriString(link.expand().getHref()).build(); } @@ -647,6 +657,11 @@ public class ControllerLinkBuilderUnitTest extends TestUtils { return null; } + @RequestMapping(value = "/{id}/foo") + HttpEntity methodWithAlternatePathVariable(@PathVariable(name = "id") String otherId) { + return null; + } + @RequestMapping(value = "/foo") HttpEntity methodForOptionalNextPage(@RequestParam(required = false) Integer offset) { return null; diff --git a/src/test/java/org/springframework/hateoas/mvc/DummyInvocationUtilsUnitTest.java b/src/test/java/org/springframework/hateoas/mvc/DummyInvocationUtilsUnitTest.java index a4f4234c..dd302cb6 100644 --- a/src/test/java/org/springframework/hateoas/mvc/DummyInvocationUtilsUnitTest.java +++ b/src/test/java/org/springframework/hateoas/mvc/DummyInvocationUtilsUnitTest.java @@ -15,7 +15,11 @@ */ package org.springframework.hateoas.mvc; +import static org.hamcrest.CoreMatchers.*; +import static org.hamcrest.MatcherAssert.*; + import org.junit.Test; +import org.springframework.hateoas.Link; import org.springframework.hateoas.TestUtils; import org.springframework.hateoas.core.DummyInvocationUtils; import org.springframework.http.HttpEntity; @@ -30,10 +34,17 @@ import org.springframework.web.bind.annotation.RequestMapping; public class DummyInvocationUtilsUnitTest extends TestUtils { @Test - public void test() { + public void pathVariableWithDefaultParameter() { - ControllerLinkBuilder.linkTo(DummyInvocationUtils.methodOn(SampleController.class).someMethod(1L)); + Link link = ControllerLinkBuilder.linkTo(DummyInvocationUtils.methodOn(SampleController.class).someMethod(1L)).withSelfRel(); + assertThat(link.getHref(), is("http://localhost/sample/1/foo")); + } + @Test + public void pathVariableWithNameParameter() { + + Link link = ControllerLinkBuilder.linkTo(DummyInvocationUtils.methodOn(SampleController.class).someOtherMethod(2L)).withSelfRel(); + assertThat(link.getHref(), is("http://localhost/sample/2/bar")); } @RequestMapping("/sample") @@ -43,5 +54,10 @@ public class DummyInvocationUtilsUnitTest extends TestUtils { HttpEntity someMethod(@PathVariable("id") Long id) { return new ResponseEntity(HttpStatus.OK); } + + @RequestMapping("/{otherName}/bar") + HttpEntity someOtherMethod(@PathVariable(name = "otherName") Long id) { + return new ResponseEntity(HttpStatus.OK); + } } }