ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[toc] 默认情况下,Spring Boot提供`/error`映射,以合理的方式处理所有错误,并在servlet容器中注册为“全局”错误页面。 对于计算机客户端,它会生成一个JSON响应,其中包含错误,HTTP状态和异常消息的详细信息。 对于浏览器客户端,有一个“whitelabel”错误视图,以HTML格式呈现相同的数据(要自定义它,添加一个解析为`error`的`View `)。 要完全替换默认行为,可以实现`ErrorController`并注册该类型的bean定义,或者添加`ErrorAttributes`类型的bean以使用现有机制但替换内容。 >`BasicErrorController`可以用作自定义`ErrorController`的基类。 如果要为新内容类型添加处理程序,则此功能特别有用(默认情况下是专门处理`text / html`并为其他所有内容提供后备)。 为此,请继承`BasicErrorController`,使用具有`produce`属性的`@RequestMapping`添加公共方法,并创建新类型的bean。 > 您还可以定义使用`@ControllerAdvice`注解的类,以自定义要为特定控制器和/或异常类型返回的JSON文档,如以下示例所示: ~~~java @ControllerAdvice(basePackageClasses = AcmeController.class) public class AcmeControllerAdvice extends ResponseEntityExceptionHandler { @ExceptionHandler(YourException.class) @ResponseBody ResponseEntity<?> handleControllerException(HttpServletRequest request, Throwable ex) { HttpStatus status = getStatus(request); return new ResponseEntity<>(new CustomErrorType(status.value(), ex.getMessage()), status); } private HttpStatus getStatus(HttpServletRequest request) { Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code"); if (statusCode == null) { return HttpStatus.INTERNAL_SERVER_ERROR; } return HttpStatus.valueOf(statusCode); } } ~~~ 在前面的示例中,如果在与`AcmeController`相同的包中定义的控制器抛出`YourException`,则使用`CustomErrorType` POJO的JSON表示而不是`ErrorAttributes`表示。 ## Custom Error Pages 如果要显示给定状态代码的自定义HTML错误页面,可以将文件添加到`/error`文件夹。 错误页面可以是静态HTML(即,添加到任何静态资源文件夹下),也可以使用模板构建。 文件名应该是确切的状态代码或系列掩码。 例如,要将`404`映射到静态HTML文件,您的文件夹结构将如下所示: ~~~ src/ +- main/ +- java/ | + <source code> +- resources/ +- public/ +- error/ | +- 404.html +- <other public assets> ~~~ 要使用FreeMarker模板映射所有`5xx`错误,您的文件夹结构如下: ~~~ src/ +- main/ +- java/ | + <source code> +- resources/ +- templates/ +- error/ | +- 5xx.ftl +- <other templates> ~~~ 对于更复杂的映射,您还可以添加实现`ErrorViewResolver`接口的bean,如以下示例所示: ~~~ public class MyErrorViewResolver implements ErrorViewResolver { @Override public ModelAndView resolveErrorView(HttpServletRequest request, HttpStatus status, Map<String, Object> model) { // Use the request or status to optionally return a ModelAndView return ... } } ~~~ 您还可以使用常规的Spring MVC功能,例如`@ExceptionHandler`方法和`@ControllerAdvice`。 然后,`ErrorController`将获取任何未处理的异常。 ## Mapping Error Pages outside of Spring MVC 对于不使用Spring MVC的应用程序,可以使用ErrorPageRegistrar接口直接注册ErrorPages。 这种抽象直接与底层嵌入式servlet容器一起工作,即使你没有Spring MVC DispatcherServlet也可以工作。 ~~~ @Bean public ErrorPageRegistrar errorPageRegistrar(){ return new MyErrorPageRegistrar(); } // ... private static class MyErrorPageRegistrar implements ErrorPageRegistrar { @Override public void registerErrorPages(ErrorPageRegistry registry) { registry.addErrorPages(new ErrorPage(HttpStatus.BAD_REQUEST, "/400")); } } ~~~