From 29b433445c77de725487a8a95899cfce78c9767b Mon Sep 17 00:00:00 2001 From: Alexander Chilingaryan Date: Wed, 13 Feb 2013 15:30:46 +0400 Subject: [PATCH] #46 - AnnotationMappingDiscoverer now deals with missing method mapping. If a method level @RequestMapping is not carrying a value we now fall back to the type level mapping as Spring MVC does. Before the fix, providing no mapping lead to an ArrayIndexOutOfBoundsException. --- .../hateoas/core/AnnotationMappingDiscoverer.java | 5 +++++ .../core/AnnotationMappingDiscovererUnitTest.java | 13 +++++++++++++ 2 files changed, 18 insertions(+) diff --git a/src/main/java/org/springframework/hateoas/core/AnnotationMappingDiscoverer.java b/src/main/java/org/springframework/hateoas/core/AnnotationMappingDiscoverer.java index 9b6d52ed..884771dd 100644 --- a/src/main/java/org/springframework/hateoas/core/AnnotationMappingDiscoverer.java +++ b/src/main/java/org/springframework/hateoas/core/AnnotationMappingDiscoverer.java @@ -88,6 +88,11 @@ public class AnnotationMappingDiscoverer implements MappingDiscoverer { } String typeMapping = getMapping(method.getDeclaringClass()); + + if (mapping == null || mapping.length == 0) { + return typeMapping; + } + return typeMapping == null ? mapping[0] : typeMapping + mapping[0]; } diff --git a/src/test/java/org/springframework/hateoas/core/AnnotationMappingDiscovererUnitTest.java b/src/test/java/org/springframework/hateoas/core/AnnotationMappingDiscovererUnitTest.java index c7120610..80f710d4 100644 --- a/src/test/java/org/springframework/hateoas/core/AnnotationMappingDiscovererUnitTest.java +++ b/src/test/java/org/springframework/hateoas/core/AnnotationMappingDiscovererUnitTest.java @@ -60,11 +60,24 @@ public class AnnotationMappingDiscovererUnitTest { assertThat(discoverer.getMapping(method), is("/method")); } + /** + * @see #46 + */ + @Test + public void treatsMissingMethodMappingAsEmptyMapping() throws Exception { + + Method method = MyController.class.getMethod("noMethodMapping"); + assertThat(discoverer.getMapping(method), is("/type")); + } + @RequestMapping("/type") interface MyController { @RequestMapping("/method") void method(); + + @RequestMapping + void noMethodMapping(); } interface ControllerWithoutTypeLevelMapping {