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 4c4113c4..0e8a2824 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 @@ -106,26 +106,6 @@ public class SpringMvcContract extends Contract.BaseContract this.resourceLoader = resourceLoader; } - @Override - protected void processAnnotationOnClass(MethodMetadata data, Class clz) { - if(clz.getInterfaces().length == 0) { - RequestMapping classAnnotation = findMergedAnnotation(clz, - RequestMapping.class); - if (classAnnotation != null) { - // Prepend path from class annotation if specified - if (classAnnotation.value().length > 0) { - String pathValue = emptyToNull(classAnnotation.value()[0]); - pathValue = resolve(pathValue); - if (!pathValue.startsWith("/")) { - pathValue = "/" + pathValue; - } - data.template().insert(0, pathValue); - } - } - } - } - - @Override public MethodMetadata parseAndValidateMetadata(Class targetType, Method method) { this.processedMethods.put(Feign.configKey(targetType, method), method); @@ -134,6 +114,19 @@ public class SpringMvcContract extends Contract.BaseContract RequestMapping classAnnotation = findMergedAnnotation(targetType, RequestMapping.class); if (classAnnotation != null) { + // Prepend path from class annotation if specified + if (classAnnotation.value().length > 0) { + String pathValue = emptyToNull(classAnnotation.value()[0]); + checkState(pathValue != null, + "RequestMapping.value() was empty on type %s", + method.getDeclaringClass().getName()); + pathValue = resolve(pathValue); + if (!pathValue.startsWith("/")) { + pathValue = "/" + pathValue; + } + md.template().insert(0, pathValue); + } + // produces - use from class annotation only if method has not specified this if (!md.template().headers().containsKey(ACCEPT)) { parseProduces(md, method, classAnnotation); 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 26363910..bf91e535 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 @@ -72,51 +72,39 @@ public class SpringMvcContractTests { String.class); MethodMetadata data = this.contract .parseAndValidateMetadata(method.getDeclaringClass(), method); - MethodMetadata extendingData = this.contract - .parseAndValidateMetadata(method.getDeclaringClass(), method); - assertEquals("/prepend/{anotherId}", data.template().url()); - assertEquals(data.template().url(), extendingData.template().url()); + assertEquals("/test/{id}", data.template().url()); assertEquals("GET", data.template().method()); - assertEquals(data.template().method(), extendingData.template().method()); assertEquals(MediaType.APPLICATION_JSON_VALUE, data.template().headers().get("Accept").iterator().next()); - assertEquals(data.template().headers().get("Accept").iterator().next(), - extendingData.template().headers().get("Accept").iterator().next()); - - assertEquals("anotherId", data.indexToName().get(0).iterator().next()); - assertEquals(data.indexToName().get(0).iterator().next(), - extendingData.indexToName().get(0).iterator().next()); } - + @Test public void testProcessAnnotations_Simple() throws Exception { Method method = TestTemplate_Simple.class.getDeclaredMethod("getTest", - String.class, String.class); + String.class); MethodMetadata data = this.contract .parseAndValidateMetadata(method.getDeclaringClass(), method); - assertEquals("/prepend/{anotherId}/test/{id}", data.template().url()); + assertEquals("/test/{id}", data.template().url()); assertEquals("GET", data.template().method()); assertEquals(MediaType.APPLICATION_JSON_VALUE, data.template().headers().get("Accept").iterator().next()); - assertEquals("anotherId", data.indexToName().get(0).iterator().next()); - assertEquals("id", data.indexToName().get(1).iterator().next()); + assertEquals("id", data.indexToName().get(0).iterator().next()); } @Test public void testProcessAnnotations_SimplePost() throws Exception { Method method = TestTemplate_Simple.class.getDeclaredMethod("postTest", - String.class, TestObject.class); + TestObject.class); MethodMetadata data = this.contract .parseAndValidateMetadata(method.getDeclaringClass(), method); - assertEquals("/prepend/{anotherId}", data.template().url()); + assertEquals("", data.template().url()); assertEquals("POST", data.template().method()); assertEquals(MediaType.APPLICATION_JSON_VALUE, data.template().headers().get("Accept").iterator().next()); - assertEquals("anotherId", data.indexToName().get(0).iterator().next()); } @@ -200,16 +188,14 @@ public class SpringMvcContractTests { @Test public void testProcessAnnotations_Advanced3() throws Exception { - Method method = TestTemplate_Simple.class.getDeclaredMethod("getTest", - String.class); + Method method = TestTemplate_Simple.class.getDeclaredMethod("getTest"); MethodMetadata data = this.contract .parseAndValidateMetadata(method.getDeclaringClass(), method); - assertEquals("/prepend/{anotherId}", data.template().url()); + assertEquals("", data.template().url()); assertEquals("GET", data.template().method()); assertEquals(MediaType.APPLICATION_JSON_VALUE, data.template().headers().get("Accept").iterator().next()); - assertEquals("anotherId", data.indexToName().get(0).iterator().next()); } @Test @@ -276,20 +262,15 @@ public class SpringMvcContractTests { return false; } - @RequestMapping("/prepend/{anotherId}") public interface TestTemplate_Simple { @RequestMapping(value = "/test/{id}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) - ResponseEntity getTest(@PathVariable String anotherId, @PathVariable String id); + ResponseEntity getTest(@PathVariable("id") String id); @RequestMapping(method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) - TestObject getTest(@PathVariable String anotherId); + TestObject getTest(); @RequestMapping(method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) - TestObject postTest(@PathVariable String anotherId, @RequestBody TestObject object); - } - - public interface TestTemplate_Simple_Extending extends TestTemplate_Simple{ - + TestObject postTest(@RequestBody TestObject object); } public interface TestTemplate_Headers {