From 8315a4033feea39f04a14c0b088e634b13fe774c Mon Sep 17 00:00:00 2001 From: bedrin Date: Thu, 8 Dec 2016 01:29:48 +0300 Subject: [PATCH] Add consumes attribute to @GetMapping Issue: SPR-14988 --- .../RequestMappingHandlerMappingTests.java | 12 +++++++++++- .../web/bind/annotation/GetMapping.java | 10 +++++++--- .../RequestMappingHandlerMappingTests.java | 18 ++++++++++++++++-- 3 files changed, 34 insertions(+), 6 deletions(-) diff --git a/spring-web-reactive/src/test/java/org/springframework/web/reactive/result/method/annotation/RequestMappingHandlerMappingTests.java b/spring-web-reactive/src/test/java/org/springframework/web/reactive/result/method/annotation/RequestMappingHandlerMappingTests.java index 8635b6f9eb..6f07210efb 100644 --- a/spring-web-reactive/src/test/java/org/springframework/web/reactive/result/method/annotation/RequestMappingHandlerMappingTests.java +++ b/spring-web-reactive/src/test/java/org/springframework/web/reactive/result/method/annotation/RequestMappingHandlerMappingTests.java @@ -21,6 +21,7 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import java.lang.reflect.Method; +import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util.Set; @@ -147,6 +148,14 @@ public class RequestMappingHandlerMappingTests { info.getProducesCondition().getProducibleMediaTypes().iterator().next().toString()); } + @Test // SPR-14988 + public void getMappingOverridesConsumesFromTypeLevelAnnotation() throws Exception { + RequestMappingInfo requestMappingInfo = assertComposedAnnotationMapping(RequestMethod.GET); + + assertArrayEquals(new MediaType[]{MediaType.ALL}, new ArrayList<>( + requestMappingInfo.getConsumesCondition().getConsumableMediaTypes()).toArray()); + } + @Test public void getMapping() throws Exception { assertComposedAnnotationMapping(RequestMethod.GET); @@ -201,6 +210,7 @@ public class RequestMappingHandlerMappingTests { @Controller @SuppressWarnings("unused") + @RequestMapping(consumes = MediaType.APPLICATION_JSON_VALUE) static class ComposedAnnotationController { @RequestMapping @@ -211,7 +221,7 @@ public class RequestMappingHandlerMappingTests { public void postJson() { } - @GetMapping("/get") + @GetMapping(value = "/get", consumes = MediaType.ALL_VALUE) public void get() { } diff --git a/spring-web/src/main/java/org/springframework/web/bind/annotation/GetMapping.java b/spring-web/src/main/java/org/springframework/web/bind/annotation/GetMapping.java index 12c8a6cd53..a2935fb3c1 100644 --- a/spring-web/src/main/java/org/springframework/web/bind/annotation/GetMapping.java +++ b/spring-web/src/main/java/org/springframework/web/bind/annotation/GetMapping.java @@ -31,9 +31,6 @@ import org.springframework.core.annotation.AliasFor; *

Specifically, {@code @GetMapping} is a composed annotation that * acts as a shortcut for {@code @RequestMapping(method = RequestMethod.GET)}. * - *

Difference between {@code @GetMapping} & {@code @RequestMapping}
- *

{@code @GetMapping} does not support the {@link RequestMapping#consumes consumes} - * attribute of {@code @RequestMapping}. * * @author Sam Brannen * @since 4.3 @@ -79,6 +76,13 @@ public @interface GetMapping { @AliasFor(annotation = RequestMapping.class) String[] headers() default {}; + /** + * Alias for {@link RequestMapping#consumes}. + * @since 4.3.5 + */ + @AliasFor(annotation = RequestMapping.class) + String[] consumes() default {}; + /** * Alias for {@link RequestMapping#produces}. */ diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/RequestMappingHandlerMappingTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/RequestMappingHandlerMappingTests.java index 7ba51e4177..fc2d7b8fd9 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/RequestMappingHandlerMappingTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/RequestMappingHandlerMappingTests.java @@ -21,6 +21,7 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import java.lang.reflect.Method; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashSet; @@ -44,7 +45,11 @@ import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.context.support.StaticWebApplicationContext; import org.springframework.web.servlet.mvc.method.RequestMappingInfo; -import static org.junit.Assert.*; +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; /** * Tests for {@link RequestMappingHandlerMapping}. @@ -145,6 +150,14 @@ public class RequestMappingHandlerMappingTests { info.getProducesCondition().getProducibleMediaTypes().iterator().next().toString()); } + @Test // SPR-14988 + public void getMappingOverridesConsumesFromTypeLevelAnnotation() throws Exception { + RequestMappingInfo requestMappingInfo = assertComposedAnnotationMapping(RequestMethod.GET); + + assertArrayEquals(new MediaType[]{MediaType.ALL}, new ArrayList<>( + requestMappingInfo.getConsumesCondition().getConsumableMediaTypes()).toArray()); + } + @Test public void getMapping() throws Exception { assertComposedAnnotationMapping(RequestMethod.GET); @@ -199,6 +212,7 @@ public class RequestMappingHandlerMappingTests { @Controller + @RequestMapping(consumes = MediaType.APPLICATION_JSON_VALUE) static class ComposedAnnotationController { @RequestMapping @@ -209,7 +223,7 @@ public class RequestMappingHandlerMappingTests { public void postJson() { } - @GetMapping("/get") + @GetMapping(value = "/get", consumes = MediaType.ALL_VALUE) public void get() { }