Set throwExceptionIfNoHandlerFound=true and deprecate
Closes gh-29491
This commit is contained in:
parent
c00508d6cf
commit
089d938e15
|
@ -162,6 +162,10 @@ Spring MVC exceptions:
|
||||||
| (default)
|
| (default)
|
||||||
|
|
|
|
||||||
|
|
||||||
|
| `NoResourceFoundException`
|
||||||
|
| (default)
|
||||||
|
|
|
||||||
|
|
||||||
| `TypeMismatchException`
|
| `TypeMismatchException`
|
||||||
| (default)
|
| (default)
|
||||||
| `+{0}+` property name, `+{1}+` property value
|
| `+{0}+` property name, `+{1}+` property value
|
||||||
|
|
|
@ -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
|
The exception can then be caught with a `HandlerExceptionResolver` (for example, by using an
|
||||||
`@ExceptionHandler` controller method) and handled as any others.
|
`@ExceptionHandler` controller method) and handled as any others.
|
||||||
|
|
||||||
By default, this is set to `false`, in which case the `DispatcherServlet` sets the
|
As of 6.1, this property is set to `true` and deprecated.
|
||||||
response status to 404 (NOT_FOUND) without raising an exception.
|
|
||||||
|
|
||||||
Note that, if xref:web/webmvc/mvc-config/default-servlet-handler.adoc[default servlet handling] is
|
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
|
also configured, unresolved requests are always forwarded to the default servlet
|
||||||
|
|
|
@ -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");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -156,7 +156,6 @@ class ExceptionHandlerTests {
|
||||||
void noHandlerFound() {
|
void noHandlerFound() {
|
||||||
WebTestClient client = MockMvcWebTestClient.bindToController(new RestPersonController())
|
WebTestClient client = MockMvcWebTestClient.bindToController(new RestPersonController())
|
||||||
.controllerAdvice(RestGlobalExceptionHandler.class, RestPersonControllerExceptionHandler.class)
|
.controllerAdvice(RestGlobalExceptionHandler.class, RestPersonControllerExceptionHandler.class)
|
||||||
.dispatcherServletCustomizer(servlet -> servlet.setThrowExceptionIfNoHandlerFound(true))
|
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
client.get().uri("/bogus")
|
client.get().uri("/bogus")
|
||||||
|
|
|
@ -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");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -138,7 +138,6 @@ public class ExceptionHandlerTests {
|
||||||
void noHandlerFound() throws Exception {
|
void noHandlerFound() throws Exception {
|
||||||
standaloneSetup(RestPersonController.class)
|
standaloneSetup(RestPersonController.class)
|
||||||
.setControllerAdvice(RestGlobalExceptionHandler.class, RestPersonControllerExceptionHandler.class)
|
.setControllerAdvice(RestGlobalExceptionHandler.class, RestPersonControllerExceptionHandler.class)
|
||||||
.addDispatcherServletCustomizer(servlet -> servlet.setThrowExceptionIfNoHandlerFound(true))
|
|
||||||
.build()
|
.build()
|
||||||
.perform(get("/bogus").accept(MediaType.APPLICATION_JSON))
|
.perform(get("/bogus").accept(MediaType.APPLICATION_JSON))
|
||||||
.andExpect(status().isOk())
|
.andExpect(status().isOk())
|
||||||
|
|
|
@ -305,7 +305,7 @@ public class DispatcherServlet extends FrameworkServlet {
|
||||||
private boolean detectAllViewResolvers = true;
|
private boolean detectAllViewResolvers = true;
|
||||||
|
|
||||||
/** Throw a NoHandlerFoundException if no Handler was found to process this request? *.*/
|
/** 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?. */
|
/** Perform cleanup of request attributes after include request?. */
|
||||||
private boolean cleanupAfterInclude = true;
|
private boolean cleanupAfterInclude = true;
|
||||||
|
@ -467,7 +467,12 @@ public class DispatcherServlet extends FrameworkServlet {
|
||||||
* <p>Default is "false", meaning the DispatcherServlet sends a NOT_FOUND error through the
|
* <p>Default is "false", meaning the DispatcherServlet sends a NOT_FOUND error through the
|
||||||
* Servlet response.
|
* Servlet response.
|
||||||
* @since 4.0
|
* @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) {
|
public void setThrowExceptionIfNoHandlerFound(boolean throwExceptionIfNoHandlerFound) {
|
||||||
this.throwExceptionIfNoHandlerFound = throwExceptionIfNoHandlerFound;
|
this.throwExceptionIfNoHandlerFound = throwExceptionIfNoHandlerFound;
|
||||||
}
|
}
|
||||||
|
|
|
@ -150,20 +150,26 @@ public class ComplexWebApplicationContext extends StaticWebApplicationContext {
|
||||||
registerSingleton("myServlet", MyServlet.class);
|
registerSingleton("myServlet", MyServlet.class);
|
||||||
|
|
||||||
pvs = new MutablePropertyValues();
|
pvs = new MutablePropertyValues();
|
||||||
pvs.add("order", "1");
|
pvs.add("order", "2");
|
||||||
pvs.add("exceptionMappings",
|
pvs.add("exceptionMappings",
|
||||||
"java.lang.IllegalAccessException=failed2\n" +
|
"java.lang.IllegalAccessException=failed2\n" +
|
||||||
"ServletRequestBindingException=failed3");
|
"ServletRequestBindingException=failed3");
|
||||||
pvs.add("defaultErrorView", "failed0");
|
pvs.add("defaultErrorView", "failed0");
|
||||||
registerSingleton("exceptionResolver1", SimpleMappingExceptionResolver.class, pvs);
|
registerSingleton("exceptionResolver2", SimpleMappingExceptionResolver.class, pvs);
|
||||||
|
|
||||||
pvs = new MutablePropertyValues();
|
pvs = new MutablePropertyValues();
|
||||||
pvs.add("order", "0");
|
pvs.add("order", "1");
|
||||||
pvs.add("exceptionMappings", "java.lang.Exception=failed1");
|
pvs.add("exceptionMappings", "java.lang.Exception=failed1");
|
||||||
pvs.add("mappedHandlers", ManagedList.of(new RuntimeBeanReference("anotherLocaleHandler")));
|
pvs.add("mappedHandlers", ManagedList.of(new RuntimeBeanReference("anotherLocaleHandler")));
|
||||||
pvs.add("defaultStatusCode", "500");
|
pvs.add("defaultStatusCode", "500");
|
||||||
pvs.add("defaultErrorView", "failed2");
|
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("multipartResolver", MockMultipartResolver.class);
|
||||||
registerSingleton("testListener", TestApplicationListener.class);
|
registerSingleton("testListener", TestApplicationListener.class);
|
||||||
|
|
|
@ -591,7 +591,6 @@ public class DispatcherServletTests {
|
||||||
DispatcherServlet complexDispatcherServlet = new DispatcherServlet();
|
DispatcherServlet complexDispatcherServlet = new DispatcherServlet();
|
||||||
complexDispatcherServlet.setContextClass(SimpleWebApplicationContext.class);
|
complexDispatcherServlet.setContextClass(SimpleWebApplicationContext.class);
|
||||||
complexDispatcherServlet.setNamespace("test");
|
complexDispatcherServlet.setNamespace("test");
|
||||||
complexDispatcherServlet.setThrowExceptionIfNoHandlerFound(true);
|
|
||||||
complexDispatcherServlet.init(new MockServletConfig(getServletContext(), "complex"));
|
complexDispatcherServlet.init(new MockServletConfig(getServletContext(), "complex"));
|
||||||
|
|
||||||
MockHttpServletRequest request = new MockHttpServletRequest(getServletContext(), "GET", "/unknown");
|
MockHttpServletRequest request = new MockHttpServletRequest(getServletContext(), "GET", "/unknown");
|
||||||
|
|
Loading…
Reference in New Issue