Skip to content

Commit

Permalink
Set throwExceptionIfNoHandlerFound=true and deprecate
Browse files Browse the repository at this point in the history
Closes gh-29491
  • Loading branch information
rstoyanchev committed Jun 19, 2023
1 parent c00508d commit 089d938
Show file tree
Hide file tree
Showing 7 changed files with 23 additions and 12 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -162,6 +162,10 @@ Spring MVC exceptions:
| (default)
|

| `NoResourceFoundException`
| (default)
|

| `TypeMismatchException`
| (default)
| `+{0}+` property name, `+{1}+` property value
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,8 +62,7 @@ initialization parameters (`init-param` elements) to the Servlet declaration in
The exception can then be caught with a `HandlerExceptionResolver` (for example, by using an
`@ExceptionHandler` controller method) and handled as any others.

By default, this is set to `false`, in which case the `DispatcherServlet` sets the
response status to 404 (NOT_FOUND) without raising an exception.
As of 6.1, this property is set to `true` and deprecated.

Note that, if xref:web/webmvc/mvc-config/default-servlet-handler.adoc[default servlet handling] is
also configured, unresolved requests are always forwarded to the default servlet
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2002-2022 the original author or authors.
* Copyright 2002-2023 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand Down Expand Up @@ -156,7 +156,6 @@ void globalRestPersonControllerExceptionHandlerTakesPrecedenceOverGlobalExceptio
void noHandlerFound() {
WebTestClient client = MockMvcWebTestClient.bindToController(new RestPersonController())
.controllerAdvice(RestGlobalExceptionHandler.class, RestPersonControllerExceptionHandler.class)
.dispatcherServletCustomizer(servlet -> servlet.setThrowExceptionIfNoHandlerFound(true))
.build();

client.get().uri("/bogus")
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2002-2022 the original author or authors.
* Copyright 2002-2023 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand Down Expand Up @@ -138,7 +138,6 @@ void globalRestPersonControllerExceptionHandlerTakesPrecedenceOverGlobalExceptio
void noHandlerFound() throws Exception {
standaloneSetup(RestPersonController.class)
.setControllerAdvice(RestGlobalExceptionHandler.class, RestPersonControllerExceptionHandler.class)
.addDispatcherServletCustomizer(servlet -> servlet.setThrowExceptionIfNoHandlerFound(true))
.build()
.perform(get("/bogus").accept(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -305,7 +305,7 @@ public class DispatcherServlet extends FrameworkServlet {
private boolean detectAllViewResolvers = true;

/** Throw a NoHandlerFoundException if no Handler was found to process this request? *.*/
private boolean throwExceptionIfNoHandlerFound = false;
private boolean throwExceptionIfNoHandlerFound = true;

/** Perform cleanup of request attributes after include request?. */
private boolean cleanupAfterInclude = true;
Expand Down Expand Up @@ -467,7 +467,12 @@ public void setDetectAllViewResolvers(boolean detectAllViewResolvers) {
* <p>Default is "false", meaning the DispatcherServlet sends a NOT_FOUND error through the
* Servlet response.
* @since 4.0
* @deprecated as of 6.1 this property is set to {@code true} by default, and
* should not need to be customized; in effect, {@link DispatcherServlet}
* should always raise {@link NoHandlerFoundException} and allow it to be
* handled through a {@link HandlerExceptionResolver}.
*/
@Deprecated(since = "6.1", forRemoval = true)
public void setThrowExceptionIfNoHandlerFound(boolean throwExceptionIfNoHandlerFound) {
this.throwExceptionIfNoHandlerFound = throwExceptionIfNoHandlerFound;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -150,20 +150,26 @@ public void refresh() throws BeansException {
registerSingleton("myServlet", MyServlet.class);

pvs = new MutablePropertyValues();
pvs.add("order", "1");
pvs.add("order", "2");
pvs.add("exceptionMappings",
"java.lang.IllegalAccessException=failed2\n" +
"ServletRequestBindingException=failed3");
pvs.add("defaultErrorView", "failed0");
registerSingleton("exceptionResolver1", SimpleMappingExceptionResolver.class, pvs);
registerSingleton("exceptionResolver2", SimpleMappingExceptionResolver.class, pvs);

pvs = new MutablePropertyValues();
pvs.add("order", "0");
pvs.add("order", "1");
pvs.add("exceptionMappings", "java.lang.Exception=failed1");
pvs.add("mappedHandlers", ManagedList.of(new RuntimeBeanReference("anotherLocaleHandler")));
pvs.add("defaultStatusCode", "500");
pvs.add("defaultErrorView", "failed2");
registerSingleton("handlerExceptionResolver", SimpleMappingExceptionResolver.class, pvs);
registerSingleton("exceptionResolver1", SimpleMappingExceptionResolver.class, pvs);

pvs = new MutablePropertyValues();
pvs.add("order", "0");
pvs.add("exceptionMappings", "org.springframework.web.servlet.NoHandlerFoundException=notFound");
pvs.add("defaultStatusCode", "404");
registerSingleton("exceptionResolver0", SimpleMappingExceptionResolver.class, pvs);

registerSingleton("multipartResolver", MockMultipartResolver.class);
registerSingleton("testListener", TestApplicationListener.class);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -591,7 +591,6 @@ public void throwExceptionIfNoHandlerFound() throws ServletException, IOExceptio
DispatcherServlet complexDispatcherServlet = new DispatcherServlet();
complexDispatcherServlet.setContextClass(SimpleWebApplicationContext.class);
complexDispatcherServlet.setNamespace("test");
complexDispatcherServlet.setThrowExceptionIfNoHandlerFound(true);
complexDispatcherServlet.init(new MockServletConfig(getServletContext(), "complex"));

MockHttpServletRequest request = new MockHttpServletRequest(getServletContext(), "GET", "/unknown");
Expand Down

0 comments on commit 089d938

Please sign in to comment.