当前位置:首页 > 科技  > 软件

详解SpringBoot错误处理

来源: 责编: 时间:2024-03-27 09:26:03 120观看
导读环境:SpringBoot2.7.161. 简介默认情况下,Spring Boot提供了一个/error映射,以合理的方式处理所有错误,并且它在servlet容器中注册为“全局”错误页面。对于机器客户端,它会生成一个JSON响应,其中包含错误、HTTP状态和异常

环境:SpringBoot2.7.16mut28资讯网——每日最新资讯28at.com

1. 简介

默认情况下,Spring Boot提供了一个/error映射,以合理的方式处理所有错误,并且它在servlet容器中注册为“全局”错误页面。对于机器客户端,它会生成一个JSON响应,其中包含错误、HTTP状态和异常消息的详细信息。对于浏览器客户端,有一个“白标签”错误视图,它以HTML格式呈现相同的数据(要自定义它,只需要定义一个以error 为beanName的View bean对象)。mut28资讯网——每日最新资讯28at.com

如果需要自定义默认的错误处理行为,可以通过设置server.error相应属性。mut28资讯网——每日最新资讯28at.com

要完全替换默认行为,可以实现ErrorController并注册为Bean,或者添加ErrorAttributes类型的bean。mut28资讯网——每日最新资讯28at.com

BasicErrorController可以用作自定义ErrorController的基类。如果想为新的内容类型添加处理程序,这一点尤其有用(默认情况是专门处理text/html,并为其他所有内容提供后备)。要做到这一点,请扩展BasicErrorController,添加一个带有具有products属性的@RequestMapping的公共方法,并创建一个新类型的bean。mut28资讯网——每日最新资讯28at.com

从Spring Framework 6.0开始,支持RFC 7807 Problem Details。Spring MVC可以使用application/pproblem+json媒体类型生成自定义错误消息,如:mut28资讯网——每日最新资讯28at.com

{  "type": "http://www.pack.com/users/666",  "title": "Unknown project",  "status": 404,  "detail": "xxxxx",  "instance": "/users/666"}

可以通过将spring.mvc.problemdetails.enabled设置为true来启用此支持。mut28资讯网——每日最新资讯28at.com

还可以定义一个用@ControllerAdvice注释的类,以自定义JSON格式输出,如以下示例所示:mut28资讯网——每日最新资讯28at.com

@RestControllerAdvice(basePackageClasses = SomeController.class)public class MyControllerAdvice extends ResponseEntityExceptionHandler {  @ExceptionHandler(Exception.class)  public ResponseEntity<?> handleControllerException(HttpServletRequest request, Throwable ex) {    HttpStatus status = getStatus(request);    return new ResponseEntity<>(new MyErrorBody(status.value(), ex.getMessage()), status);  }  private HttpStatus getStatus(HttpServletRequest request) {    Integer code = (Integer) request.getAttribute(RequestDispatcher.ERROR_STATUS_CODE);    HttpStatus status = HttpStatus.resolve(code);    return (status != null) ? status : HttpStatus.INTERNAL_SERVER_ERROR;  }}

2. 自定义错误页

如果要显示给定状态代码的自定义HTML错误页面,可以将文件添加到/error目录中。错误页面可以是静态HTML(即添加到任何静态资源目录下),也可以使用模板构建。文件的名称应该是确切的状态代码或序列掩码。mut28资讯网——每日最新资讯28at.com

例如,要将404映射到静态HTML文件,目录结构如下:mut28资讯网——每日最新资讯28at.com

src/ +- main/     +- java/     |   + <source code>     +- resources/         +- public/             +- error/             |   +- 404.html             +- <other public assets>

要使用FreeMarker模板映射所有5xx错误,目录结构如下:mut28资讯网——每日最新资讯28at.com

src/ +- main/     +- java/     |   + <source code>     +- resources/         +- templates/             +- error/             |   +- 5xx.ftlh             +- <other templates>

对于更复杂的映射,还可以添加实现ErrorViewResolver接口的bean,如以下示例所示:mut28资讯网——每日最新资讯28at.com

@Componentpublic class PackErrorViewResolver implements ErrorViewResolver {  @Override  public ModelAndView resolveErrorView(HttpServletRequest request, HttpStatus status, Map<String, Object> model) {    if (status == HttpStatus.INTERNAL_SERVER_ERROR) {      return new ModelAndView("error") ;    }    return null ;  }}

3. 向容器注册错误页

对于不使用Spring MVC的应用程序,可以使用ErrorPageRegistrar接口直接注册ErrorPages。这种抽象直接与底层嵌入式Servlet容器一起工作,即使没有Spring MVC DispatcherServlet也能工作。mut28资讯网——每日最新资讯28at.com

@Configurationpublic class PackErrorPagesConfiguration {  @Bean  public ErrorPageRegistrar errorPageRegistrar() {    return this::registerErrorPages;  }  private void registerErrorPages(ErrorPageRegistry registry) {    registry.addErrorPages(new ErrorPage(HttpStatus.BAD_REQUEST, "/400"));  }}

4. 默认错误页注册原理

这里以Tomcat为例,SpringBoot内嵌tomcat容器会自动注册TomcatServletWebServerFactory该类进行Tomcat容器的配置,这其中就包括将错误页注册到tomcat中。并且该类实现了ErrorPageRegistry接口,该类专门用来注册错误页。mut28资讯网——每日最新资讯28at.com

public class TomcatServletWebServerFactory {  public WebServer getWebServer(...) {    Tomcat tomcat = new Tomcat();    // ...    prepareContext(...);  }  protected void prepareContext(...) {    // ...    configureContext(...)  }  protected void configureContext(...) {    // ...    // 获取容器中定义的所有ErrorPage错误页    for (ErrorPage errorPage : getErrorPages()) {      org.apache.tomcat.util.descriptor.web.ErrorPage tomcatErrorPage = new org.apache.tomcat.util.descriptor.web.ErrorPage();      tomcatErrorPage.setLocation(errorPage.getPath());      tomcatErrorPage.setErrorCode(errorPage.getStatusCode());      tomcatErrorPage.setExceptionType(errorPage.getExceptionName());      context.addErrorPage(tomcatErrorPage);    }  }}

这些ErrorPage通过如下方式被添加到上面的TomcatServletWebServerFactory中mut28资讯网——每日最新资讯28at.com

SpringBoot会注册一个ErrorPageRegistrarBeanPostProcessor处理器mut28资讯网——每日最新资讯28at.com

public class ErrorPageRegistrarBeanPostProcessor implements BeanPostProcessor, BeanFactoryAware {  public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {    // 上面说了TomcatServletWebServerFactory实现了ErrorPageRegistry接口    if (bean instanceof ErrorPageRegistry) {      postProcessBeforeInitialization((ErrorPageRegistry) bean);    }    return bean;  }  private void postProcessBeforeInitialization(ErrorPageRegistry registry) {    for (ErrorPageRegistrar registrar : getRegistrars()) {      registrar.registerErrorPages(registry);    }  }  private Collection<ErrorPageRegistrar> getRegistrars() {    if (this.registrars == null) {      // 获取容器中的所有ErrorPageRegistrar      this.registrars = new ArrayList<>(          this.beanFactory.getBeansOfType(ErrorPageRegistrar.class, false, false).values());      this.registrars.sort(AnnotationAwareOrderComparator.INSTANCE);      this.registrars = Collections.unmodifiableList(this.registrars);    }    return this.registrars;  }}

注意:自定义ErrorPageRegistrar时,我们可以通过实现Ordered接口控制优先级mut28资讯网——每日最新资讯28at.com

以上是本篇文章的全部内容,希望对你有帮助。mut28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-79606-0.html详解SpringBoot错误处理

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: React为什么要废弃ComponentWillMount、ReceiveProps和Update这三个生命周期

下一篇: Figma 在协同编辑中使用的顺序一致性算法: Fractional indexing

标签:
  • 热门焦点
  • 俄罗斯:将审查iPhone等外国公司设备 保数据安全

    俄罗斯:将审查iPhone等外国公司设备 保数据安全

    iPhone和特斯拉都属于在各自领域领头羊的品牌,推出的产品也也都是数一数二的,但对于一些国家而言,它们的产品可靠性和安全性还是在限制范围内。近日,俄罗斯联邦通信、信息技术
  • 天猫精灵Sound Pro体验:智能音箱没有音质?来听听我的

    天猫精灵Sound Pro体验:智能音箱没有音质?来听听我的

    这几年除了手机作为智能生活终端最主要的核心之外,第二个可以成为中心点的产品是什么?——是智能音箱。 手机在执行命令的时候有两种操作方式,手和智能语音助手,而智能音箱只
  • iPhone卖不动了!苹果股价创年内最大日跌幅:市值一夜蒸发万亿元

    iPhone卖不动了!苹果股价创年内最大日跌幅:市值一夜蒸发万亿元

    8月5日消息,今天凌晨美股三大指数高开低走集体收跌,道指跌0.41%;纳指跌0.36%;标普500指数跌0.52%。热门科技股也都变化极大,其中苹果报181.99美元,跌4.8%,创
  • 之家push系统迭代之路

    之家push系统迭代之路

    前言在这个信息爆炸的互联网时代,能够及时准确获取信息是当今社会要解决的关键问题之一。随着之家用户体量和内容规模的不断增大,传统的靠"主动拉"获取信息的方式已不能满足用
  • 破圈是B站头上的紧箍咒

    破圈是B站头上的紧箍咒

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之每年的暑期档都少不了瞄准追剧女孩们的古偶剧集,2021年有优酷的《山河令》,2022年有爱奇艺的《苍兰诀》,今年却轮到小破站抓住了追
  • 当家的盒马,加速谋生

    当家的盒马,加速谋生

    来源 | 价值星球Planet作者 | 归去来自己&ldquo;当家&rdquo;的盒马,开始加速谋生了。据盒马官微消息,盒马计划今年开放生鲜供应链,将其生鲜商品送往食堂。目前,盒马在上海已经与
  • 华为Mate60标准版细节曝光:经典星环相机模组回归

    华为Mate60标准版细节曝光:经典星环相机模组回归

    这段时间以来,关于华为新旗舰的爆料日渐密集。据此前多方爆料,今年华为将开始恢复一年双旗舰战略,除上半年推出的P60系列外,往年下半年的Mate系列也将
  • 三星Galaxy Z Fold5今日亮相:厚度缩减但仍略显厚重

    三星Galaxy Z Fold5今日亮相:厚度缩减但仍略显厚重

    据官方此前宣布,三星将于7月26日也就是今天在韩国首尔举办Unpacked活动,届时将带来带来包括Galaxy Buds 3、Galaxy Watch 6、Galaxy Tab S9、Galaxy
  • 2022爆款:ROG魔霸6 冰川散热系统持续护航

    2022爆款:ROG魔霸6 冰川散热系统持续护航

    喜逢开学季,各大商家开始推出自己的新产品,进行打折促销活动。对于忠实的端游爱好者来说,能够拥有一款梦寐以求的笔记本电脑是一件十分开心的事。但是现在的
Top