diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/condition/RequestMethodsRequestCondition.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/condition/RequestMethodsRequestCondition.java index a8f67d3a581..b0dd93d795b 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/condition/RequestMethodsRequestCondition.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/condition/RequestMethodsRequestCondition.java @@ -39,8 +39,8 @@ import org.springframework.web.cors.CorsUtils; */ public final class RequestMethodsRequestCondition extends AbstractRequestCondition { - private static final RequestMethodsRequestCondition HEAD_CONDITION = - new RequestMethodsRequestCondition(RequestMethod.HEAD); + private static final RequestMethodsRequestCondition GET_CONDITION = + new RequestMethodsRequestCondition(RequestMethod.GET); private final Set methods; @@ -140,7 +140,7 @@ public final class RequestMethodsRequestCondition extends AbstractRequestConditi } } if (httpMethod == HttpMethod.HEAD && getMethods().contains(RequestMethod.GET)) { - return HEAD_CONDITION; + return GET_CONDITION; } } return null; @@ -159,7 +159,18 @@ public final class RequestMethodsRequestCondition extends AbstractRequestConditi */ @Override public int compareTo(RequestMethodsRequestCondition other, HttpServletRequest request) { - return (other.methods.size() - this.methods.size()); + if (other.methods.size() != this.methods.size()) { + return other.methods.size() - this.methods.size(); + } + else if (this.methods.size() == 1) { + if (this.methods.contains(RequestMethod.HEAD) && other.methods.contains(RequestMethod.GET)) { + return -1; + } + else if (this.methods.contains(RequestMethod.GET) && other.methods.contains(RequestMethod.HEAD)) { + return 1; + } + } + return 0; } } diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/condition/RequestMethodsRequestConditionTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/condition/RequestMethodsRequestConditionTests.java index 10503065c2b..df336a3c32e 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/condition/RequestMethodsRequestConditionTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/condition/RequestMethodsRequestConditionTests.java @@ -53,7 +53,7 @@ public class RequestMethodsRequestConditionTests { @Test public void getMatchingConditionWithHttpHead() { testMatch(new RequestMethodsRequestCondition(HEAD), HEAD); - testMatch(new RequestMethodsRequestCondition(GET), HEAD); + testMatch(new RequestMethodsRequestCondition(GET), GET); testNoMatch(new RequestMethodsRequestCondition(POST), HEAD); } diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ServletAnnotationControllerHandlerMethodTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ServletAnnotationControllerHandlerMethodTests.java index 24d9ea2c05e..48163090a75 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ServletAnnotationControllerHandlerMethodTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ServletAnnotationControllerHandlerMethodTests.java @@ -1776,6 +1776,18 @@ public class ServletAnnotationControllerHandlerMethodTests extends AbstractServl assertEquals("body", response.getContentAsString()); } + @Test + public void httpHeadExplicit() throws ServletException, IOException { + initServletWithControllers(ResponseEntityController.class); + + MockHttpServletRequest request = new MockHttpServletRequest("HEAD", "/stores"); + MockHttpServletResponse response = new MockHttpServletResponse(); + getServlet().service(request, response); + + assertEquals(200, response.getStatus()); + assertEquals("v1", response.getHeader("h1")); + } + @Test public void httpOptions() throws ServletException, IOException { initServletWithControllers(ResponseEntityController.class); @@ -3100,6 +3112,16 @@ public class ServletAnnotationControllerHandlerMethodTests extends AbstractServl public ResponseEntity baz() { return ResponseEntity.ok().header("MyResponseHeader", "MyValue").body("body"); } + + @RequestMapping(path = "/stores", method = RequestMethod.HEAD) + public ResponseEntity headResource() { + return ResponseEntity.ok().header("h1", "v1").build(); + } + + @RequestMapping(path = "/stores", method = RequestMethod.GET) + public ResponseEntity getResource() { + return ResponseEntity.ok().body("body"); + } } @Controller