From b619ee00bfafe91e42b6c0b7ab736c19332d6d69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Bo=C5=BEek?= Date: Tue, 3 Jan 2017 14:53:11 +0100 Subject: [PATCH] Adds composed @RequestMapping annotations support Fixed short circuit condition to correctly detect @RequestMapping shortcuts (@GetMapping, @PostMaping etc.) Fixes gh-1201 --- .../feign/support/SpringMvcContract.java | 3 +- .../feign/support/SpringMvcContractTests.java | 39 ++++++++++++++++++- 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/support/SpringMvcContract.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/support/SpringMvcContract.java index f0018c8b..40b6f077 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/support/SpringMvcContract.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/support/SpringMvcContract.java @@ -156,7 +156,8 @@ public class SpringMvcContract extends Contract.BaseContract @Override protected void processAnnotationOnMethod(MethodMetadata data, Annotation methodAnnotation, Method method) { - if (!(methodAnnotation instanceof RequestMapping)) { + if (!RequestMapping.class.isInstance(methodAnnotation) && !methodAnnotation + .annotationType().isAnnotationPresent(RequestMapping.class)) { return; } diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/support/SpringMvcContractTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/support/SpringMvcContractTests.java index 624f8928..3b817ba4 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/support/SpringMvcContractTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/support/SpringMvcContractTests.java @@ -48,6 +48,8 @@ import feign.MethodMetadata; import lombok.AllArgsConstructor; import lombok.NoArgsConstructor; import lombok.ToString; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; /** * @author chadjaros @@ -101,6 +103,21 @@ public class SpringMvcContractTests { assertEquals("id", data.indexToName().get(0).iterator().next()); } + @Test + public void testProcessAnnotations_SimpleGetMapping() throws Exception { + Method method = TestTemplate_Simple.class.getDeclaredMethod("getMappingTest", + String.class); + MethodMetadata data = this.contract + .parseAndValidateMetadata(method.getDeclaringClass(), method); + + assertEquals("/test/{id}", data.template().url()); + assertEquals("GET", data.template().method()); + assertEquals(MediaType.APPLICATION_JSON_VALUE, + data.template().headers().get("Accept").iterator().next()); + + assertEquals("id", data.indexToName().get(0).iterator().next()); + } + @Test public void testProcessAnnotations_Class_AnnotationsGetSpecificTest() throws Exception { @@ -162,6 +179,20 @@ public class SpringMvcContractTests { } + @Test + public void testProcessAnnotations_SimplePostMapping() throws Exception { + Method method = TestTemplate_Simple.class.getDeclaredMethod("postMappingTest", + TestObject.class); + MethodMetadata data = this.contract + .parseAndValidateMetadata(method.getDeclaringClass(), method); + + assertEquals("", data.template().url()); + assertEquals("POST", data.template().method()); + assertEquals(MediaType.APPLICATION_JSON_VALUE, + data.template().headers().get("Accept").iterator().next()); + + } + @Test public void testProcessAnnotationsOnMethod_Advanced() throws Exception { Method method = TestTemplate_Advanced.class.getDeclaredMethod("getTest", @@ -392,8 +423,14 @@ public class SpringMvcContractTests { @RequestMapping(method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) TestObject getTest(); + @GetMapping(value = "/test/{id}", produces = MediaType.APPLICATION_JSON_VALUE) + ResponseEntity getMappingTest(@PathVariable("id") String id); + @RequestMapping(method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) TestObject postTest(@RequestBody TestObject object); + + @PostMapping(produces = MediaType.APPLICATION_JSON_VALUE) + TestObject postMappingTest(@RequestBody TestObject object); } @RequestMapping("/prepend/{classId}") @@ -457,7 +494,7 @@ public class SpringMvcContractTests { @RequestMapping(path = "/test/{id}", method = RequestMethod.PUT, produces = MediaType.APPLICATION_JSON_VALUE) ResponseEntity getTest(@RequestHeader("Authorization") String auth, @PathVariable("id") String id, @RequestParam("amount") Integer amount); - + @RequestMapping(path = "/test2", method = RequestMethod.PUT, produces = MediaType.APPLICATION_JSON_VALUE) ResponseEntity getTest2( @RequestHeader(name = "Authorization") String auth,