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 13946db1e4..e93f69c24d 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 @@ -22,6 +22,7 @@ import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import java.lang.reflect.Method; import java.util.Arrays; +import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util.Map; @@ -145,6 +146,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 +208,7 @@ public class RequestMappingHandlerMappingTests { @Controller + @RequestMapping(consumes = MediaType.APPLICATION_JSON_VALUE) static class ComposedAnnotationController { @RequestMapping @@ -209,7 +219,7 @@ public class RequestMappingHandlerMappingTests { public void postJson() { } - @GetMapping("/get") + @GetMapping(value = "/get", consumes = MediaType.ALL_VALUE) public void get() { }