Spring Boot /error 接口异常处理简介

为什么会有这篇博客

    故事的开始是这个样子的。在一个慵懒的午后,闲的蛋疼的一天里我在测试着接口,然后我就看到了如下画面 ,它们是这样的还有这样的:

b35e673cdd0625aabb5120f562e6c50ec28.jpg 39fa6182a61930da12c94463fc389c52e50.jpg

 

很显然这是当应用发生错误时候的提示。很不巧的是公司的项目最近好像经常出现各种奇怪的错误异常信息,但是开发人员却由于不能快速的定位问题而一脸懵逼的样子。于是乎我决定是时候把这个异常处理好好给搞一下了(整点自定义啥的让信息更详细)。  æ¥çæºå¾å 在搞了一段时间后,终于这篇博客是时候诞生了(老妹儿 法克儿 ***** )。æ¥çæºå¾å

 

Spring Boot 如何处理异常信息?

    如果有人说通过 @ExceptionHandler 来进行处理那也没错 ,不过我在这里要说的是另外一种方式那就是当发生异常后,将这个 Request forward 到一个错误处理的接口上去 , 默认是 /error . Spring Boot 提供了一个默认的 BasicErrorController 来处理这个 /error 接口的请求 。一个方法处理响应 json 格式数据, 另一个函数响应一个 html 页面,也就是我们前面看到的那个不能再糊弄事的 Whitelabel Error Page 。

723739de7507c2220f5693b8995f5e3f33f.jpg

 

那么看到这个代码我就又产生了一个疑问,这个名字叫做 error 的试图是定义在哪里呢 ? 刚开始的时候我以为是 spring boot 包内部的一个 jsp 或者 html 页面什么的,然后我就开始搜索 ...... 最后没找到。经过 debug 查看源码后我发现了这个东西 :ErrorMvcAutoConfiguration , 里面有一个 WhitelabelErrorViewConfiguration 里面还有一个 SpelView 。就是它了,名称叫 error 的视图,显然这个我们是可以覆盖的只要我们自己再声明一个 bean 名称为 error 就行了。 

3dcfd47157d0fc3cbf73013641eb1efcf81.jpg

 

当然看到这里我大致知道了 spring boot 是如何通过 /error 接口来处理异常的。但是还是觉得心理空落落的 ,感觉还是少了点什么。对了我之前说过了有异常后就会把当前 Request forward 到 /error 这个接口上 , 对了我现在想知道就是在什么地方进行 forward 的 。

 

How to forward a request to the /error interface

老实说这个问题的答案我还是找了一会的。æ¥çæºå¾å  最后我发现不是在 Spring 中做的这个 forward 操作。必须提前声明下我的项目用的是内嵌的 tomcat ,至于其他类型的容器这篇博客可能并不适用。  forward 到 /error 的操作是在 tomcat 的 org.apache.catalina.core.StandardHostValve 中进行的。125a98393811828221b0c6738c2684801f0.jpg

  

 

转载于:https://my.oschina.net/j4love/blog/3098834

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot 中,/error 接口用于处理应用程序中未捕获的异常。当应用程序中发生异常时,Spring Boot 会将异常信息封装成一个 ErrorController 类型的对象,并将其传递给 /error 接口进行处理。 默认情况下,Spring Boot 会将异常信息以 HTML 格式返回给客户端。如果需要将异常信息以 JSON 格式返回给客户端,则可以自定义 /error 接口的实现。 具体实现步骤如下: 1. 创建一个实现了 ErrorController 接口的类,例如: ``` @RestController public class MyErrorController implements ErrorController { @RequestMapping("/error") public ResponseEntity<Map<String, Object>> handleError(HttpServletRequest request) { Map<String, Object> errorAttributes = new HashMap<>(); errorAttributes.put("status", request.getAttribute("javax.servlet.error.status_code")); errorAttributes.put("message", request.getAttribute("javax.servlet.error.message")); // 添加其他错误信息 return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(errorAttributes); } @Override public String getErrorPath() { return "/error"; } } ``` 2. 在该类中定义 /error 接口的处理方法。在该方法中,可以从 HttpServletRequest 对象中获取异常信息,并将其封装成一个 Map 类型的对象。 3. 如果需要将异常信息以 JSON 格式返回给客户端,则需要在处理方法上添加 @RestController 注解。 4. 在 getErrorPath 方法中返回 /error 接口的映射路径。 这样,在应用程序中发生未捕获的异常时,就会调用自定义的 /error 接口进行处理,并将异常信息以 JSON 格式返回给客户端。 以上就是 Spring Boot /error 接口异常处理的简单介绍。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值