异常
如果在请求映射期间发生异常,或者从请求处理程序(例如@Controller
)抛出异常,则DispatcherServlet
会委托给一系列HandlerExceptionResolver
Bean 来解析异常并提供替代处理,这通常是错误响应。
下表列出了可用的HandlerExceptionResolver
实现。
HandlerExceptionResolver |
描述 (Description) |
---|---|
|
异常类名和错误视图名之间的映射。对于在浏览器应用程序中呈现错误页面很有用。 |
解析Spring MVC引发的异常,并将它们映射到HTTP状态代码。另请参见替代的 |
|
|
解析带有 |
|
通过调用 |
解析器链 (Chain of Resolvers)
可以通过在Spring配置中声明多个HandlerExceptionResolver
Bean 并根据需要设置它们的order
属性来形成异常解析器链。order属性越高,异常解析器的位置越靠后。
HandlerExceptionResolver
的约定指定它可以返回:
-
一个指向错误视图的
ModelAndView
。 -
如果异常在解析器中已处理,则为空的
ModelAndView
。 -
null
,如果异常仍然未解决,则由后续解析器尝试,如果异常在最后仍然存在,则允许其冒泡到Servlet容器。
MVC配置 (MVC Config)自动声明用于默认Spring MVC异常、带有@ResponseStatus
注解的异常以及支持@ExceptionHandler
方法的内置解析器。可以自定义该列表或替换它。
容器错误页面 (Container Error Page)
如果任何HandlerExceptionResolver
都无法解决异常,因此将其传播,或者如果响应状态设置为错误状态(即4xx、5xx),则Servlet容器可以使用HTML呈现默认错误页面。要自定义容器的默认错误页面,可以在web.xml
中声明错误页面映射。以下示例显示了如何执行此操作。
<error-page>
<location>/error</location>
</error-page>
给定前面的示例,当异常冒泡或响应具有错误状态时,Servlet容器会在容器内对已配置的URL(例如/error
)执行ERROR分派。然后,DispatcherServlet
会处理它,可能将其映射到@Controller
,可以实现该控制器以返回带有模型的错误视图名称或呈现JSON响应,如下例所示。
-
Java
-
Kotlin
@RestController
public class ErrorController {
@RequestMapping(path = "/error")
public Map<String, Object> handle(HttpServletRequest request) {
Map<String, Object> map = new HashMap<>();
map.put("status", request.getAttribute("jakarta.servlet.error.status_code"));
map.put("reason", request.getAttribute("jakarta.servlet.error.message"));
return map;
}
}
@RestController
class ErrorController {
@RequestMapping(path = ["/error"])
fun handle(request: HttpServletRequest): Map<String, Any> {
val map = HashMap<String, Any>()
map["status"] = request.getAttribute("jakarta.servlet.error.status_code")
map["reason"] = request.getAttribute("jakarta.servlet.error.message")
return map
}
}
Servlet API不提供在Java中创建错误页面映射的方法。但是,您可以同时使用WebApplicationInitializer 和最小的web.xml 。 |