Skip to content

Commit 0a6cac5

Browse files
committed
SPR-4927 - Return 405 instead of 404 when HTTP method is not supported
1 parent 752832a commit 0a6cac5

File tree

2 files changed

+52
-0
lines changed

2 files changed

+52
-0
lines changed

org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/mvc/annotation/AnnotationMethodHandlerAdapter.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -446,6 +446,10 @@ public Method resolveHandlerMethod(HttpServletRequest request) throws ServletExc
446446
if (match && mappingInfo.methods.length == 0 && mappingInfo.params.length == 0 &&
447447
resolvedMethodName != null && !resolvedMethodName.equals(handlerMethod.getName())) {
448448
match = false;
449+
} else {
450+
for (RequestMethod requestMethod : mappingInfo.methods) {
451+
allowedMethods.add(requestMethod.toString());
452+
}
449453
}
450454
}
451455
if (match) {

org.springframework.web.servlet/src/test/java/org/springframework/web/servlet/mvc/annotation/UriTemplateServletAnnotationControllerTests.java

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,33 @@ public void crud() throws Exception {
183183
assertEquals("remove-42", response.getContentAsString());
184184
}
185185

186+
@Test
187+
public void methodNotSupported() throws Exception {
188+
initServlet(MethodNotAllowedController.class);
189+
190+
MockHttpServletRequest request = new MockHttpServletRequest("GET", "/hotels/1");
191+
MockHttpServletResponse response = new MockHttpServletResponse();
192+
servlet.service(request, response);
193+
assertEquals(200, response.getStatus());
194+
195+
request = new MockHttpServletRequest("POST", "/hotels/1");
196+
response = new MockHttpServletResponse();
197+
servlet.service(request, response);
198+
assertEquals(405, response.getStatus());
199+
200+
request = new MockHttpServletRequest("GET", "/hotels");
201+
response = new MockHttpServletResponse();
202+
servlet.service(request, response);
203+
assertEquals(200, response.getStatus());
204+
205+
request = new MockHttpServletRequest("POST", "/hotels");
206+
response = new MockHttpServletResponse();
207+
servlet.service(request, response);
208+
assertEquals(405, response.getStatus());
209+
210+
211+
}
212+
186213
private void initServlet(final Class<?> controllerclass) throws ServletException {
187214
servlet = new DispatcherServlet() {
188215
@Override
@@ -337,5 +364,26 @@ public void remove(@PathVariable String hotel, Writer writer) throws IOException
337364

338365
}
339366

367+
@Controller
368+
@RequestMapping("/hotels")
369+
public static class MethodNotAllowedController {
370+
371+
@RequestMapping(method = RequestMethod.GET)
372+
public void list(Writer writer) {
373+
}
374+
375+
@RequestMapping(method = RequestMethod.GET, value = "{hotelId}")
376+
public void show(@PathVariable long hotelId, Writer writer) {
377+
}
378+
379+
@RequestMapping(method = RequestMethod.PUT, value = "{hotelId}")
380+
public void createOrUpdate(@PathVariable long hotelId, Writer writer) {
381+
}
382+
383+
@RequestMapping(method = RequestMethod.DELETE, value = "/{hotelId}")
384+
public void remove(@PathVariable long hotelId, Writer writer) {
385+
}
386+
}
387+
340388

341389
}

0 commit comments

Comments
 (0)