gpt4 book ai didi

Springboot异常错误处理解决方案详解

转载 作者:qq735679552 更新时间:2022-09-29 22:32:09 25 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章Springboot异常错误处理解决方案详解由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

1.在有模板引擎的情况下:

springboot会默认找 templates/error/错误状态码.html,所以我们要定制化错误页面就可以到templates/error下创建一个【对应错误状态码.html】html文件,当发生此状态码的错误springboot就会来到对应的页面.

同时如果我们想让400-499之间的错误都去同一个错误页面,那我们可以在templates/error下创建一个4xx.html。同理500-599的错误可以用5xx.html.

Springboot异常错误处理解决方案详解

注意:springboot会优先匹配具体的【错误状态码.html】,然后再匹配4xx,5xx的。例如:发生了404错误,springboot优先到templates/error下找404.html,如果没有404.html,再找有没有4xx.html,有的话就会使用4xx.html.

在错误页面我们能够获取到的信息:

  • timestamp:时间戳
  • status:状态码
  • error:错误提示
  • exception:异常对象 springboot2.1.6在页面获取异常对象要现在全局配置文件中加入:server.error.include-exception=true
  • message:异常消息
  • errors:JSR数据校验的错误

2.在没有模板引擎(模板引擎找不到这个错误页面)的情况下,springboot会到静态资源文件夹下的error包下找.

3.以上都没有找到错误页面,就默认用springboot默认的错误提示页面 。

错误异常处理——自定义响应json数据 。

上边的错误处理中,如果是浏览器访问可以响应我们自己定制的错误页面,但是如果是其他客户端访问,则只会响应固定的json数据,如下图所示:

Springboot异常错误处理解决方案详解

下边讲解三个异常处理返回自定义json数据的方式 。

首先编写一个自定义异常类 。

public class UserNotExitException extends RuntimeException {  public UserNotExitException() {    super("用户不存在");  }}

方式一:

在异常处理器类中,通过map封装我们自己的json数据,然后将map返回.

@ControllerAdvicepublic class MyExceptionHandler {  @ResponseBody  @ExceptionHandler(UserNotExitException.class)  public Map<String,Object> userNotExitExceptionHandler(Exception e){    Map<String,Object> map = new HashMap<>();    map.put("code","user.notexit");    map.put("message",e.getMessage());    return map;  }}

  @ControllerAdvice:表明这是一个全局异常处理类 。

  @ExceptionHandler(UserNotExitException.class):表明标注的此方法用于处理UserNotExitException异常.

  @ResponseBody:将返回结果封装为json 。

3.结果 。

  不管浏览器还是其他客户端发生该异常都统一得到下图的响应 。

      Springboot异常错误处理解决方案详解

方式二:转发到/error,进行自适应响应效果处理 。

@ControllerAdvicepublic class MyExceptionHandler {  @ExceptionHandler(UserNotExitException.class)  public String userNotExitExceptionHandler(Exception e, HttpServletRequest request){    Map<String,Object> map = new HashMap<>();    request.setAttribute("javax.servlet.error.status_code",500);    map.put("code","user.notexit");    map.put("message","用户出错了");    return "forward:/error";  }}

将响应转发到 /error,让springboot帮我们生成自适应效果。但是必须注意,一定要设置错误状态码(如代码中标黄色的那一句代码)。不设置的话springboot就不会进入定制错误页面的解析流程。设置了之后springboot就会到templates/error/错误状态码.html页面处理.

注意:此方式浏览器访问发生错误不再响应的是json数据了,而是对于的错误响应网页.

Springboot异常错误处理解决方案详解

其他客户端访问响应的是json数据,但是响应的json数据中没有我们map中put的数据.

Springboot异常错误处理解决方案详解

方式三:通过DefaultErrorAttribute 。

1.在异常处理器类中将响应的json数据封装到map中,然后再将map放到请求域中 。

@ControllerAdvicepublic class MyExceptionHandler {  @ExceptionHandler(UserNotExitException.class)  public String userNotExitExceptionHandler(Exception e, HttpServletRequest request){    Map<String,Object> map = new HashMap<>();    request.setAttribute("javax.servlet.error.status_code",500);    map.put("code","user.notexit");    map.put("message","用户出错了");    request.setAttribute("ext",map);    return "forward:/error";  }}

2.编写错误属性类:新建一个类继承DefaultErrorAttribute类,并重写其中的getErrorAttributes方法 。

@Componentpublic class MyErrorAttributes extends DefaultErrorAttributes {  @Override  public Map<String, Object> getErrorAttributes(WebRequest webRequest, boolean includeStackTrace) {    Map<String, Object> map = super.getErrorAttributes(webRequest, includeStackTrace);    map.put("company","atguigu");    Map<String, Object> ext = (Map<String, Object>) webRequest.getAttribute("ext", 0);    map.put("ext",ext);    return map;  }}

注意:

(1).必须将错误属性类添加到spring容器中.

(2).第7行标黄那段代码的作用是获取异常处理类中的map。其中最后的参数0,是从request域中取出数据“ext”。若要从session域中取数据,则将该参数设置为1.(0是从request域获取数据,1是从session域中获取数据) 。

(3).错误属性类中返回的map中的所有内容,页面都可以获取到.

总结:

  此方式最好,当浏览器访问发生错误时,会响应对应的错误响应页面,当其他客户端访问发生错误时也会响应我们定制的json数据.

浏览器响应:

Springboot异常错误处理解决方案详解

其他客户端响应:

Springboot异常错误处理解决方案详解

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我.

原文链接:https://www.cnblogs.com/bear7/p/13501638.html 。

最后此篇关于Springboot异常错误处理解决方案详解的文章就讲到这里了,如果你想了解更多关于Springboot异常错误处理解决方案详解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com