首页 > 编程语言 > 详细

24. SpringBoot 自定义异常信息

时间:2021-08-16 10:34:13      阅读:14      评论:0      收藏:0      [点我收藏+]

第一种方法:

1、自己写一个运行时异常

技术分享图片

然后故意出现这个异常抛出异常【测试】

技术分享图片

然后自定义一个异常解析器即可:

技术分享图片
package com.bihu.component;

import com.bihu.Exception.UserNonExistentException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.HashMap;
import java.util.Map;

@ControllerAdvice       //这个注解标志异常的
public class MyExceptionHandler{

    @ResponseBody
    @ExceptionHandler(UserNonExistentException.class)       //表示一旦抛出这个异常 此处理器就生效
    public Map<String,Object> exceptionHandling(Exception e) {
            Map<String,Object> result = new HashMap<>();
            result.put("message",e.getMessage());
            return  result;

    }

}
MyExceptionHandler

运行:

技术分享图片

 

 

 所以无论是 客户端还是浏览器 都是以 JSON格式来返回错误信息,,,,,,这样的缺点就是自适应性不好。

 



 

第二种方法:【自适应性,浏览器解析网页;客户端解析为JSON】

在第一种的前提下,改变异常解析器

1.自定义自己的异常解析器:

技术分享图片
package com.bihu.component;

import com.bihu.Exception.UserNonExistentException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;

import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;

@ControllerAdvice       //这个注解标志异常的
public class MyExceptionHandler{

    @ExceptionHandler(UserNonExistentException.class)       //表示一旦抛出这个异常 此处理器就生效
    public String exceptionHandling(Exception e, HttpServletRequest request) {
            //由于这里转发到error,所以这里的错误码永远是200成功 我们需要更改:
            request.setAttribute("javax.servlet.error.status_code",500);    //至于为啥 后面一起讲
            Map<String,Object> map = new HashMap<>();       //这里的参数是带不出去的 
            return "froward:/error";    //为了自适应性 转发到 /error页面 让SpringBoot解析
    }

}
异常解析器

运行发现 浏览器和客户端给出的都不一样了:

技术分享图片    技术分享图片

 

 

 

错误码是200我理解,为什么设置错误码是用request.setAttribute() ??? 查看源码得知 ,SpringBoot原始获取错误码是这样获取的:

技术分享图片 进入getStatus方法:技术分享图片

 

 

虽然方法是这样,但是我们想携带出去的数据是携带不出去的【自定义数据】,那么我们就得继续看源码:

技术分享图片可以清楚明白的看到是getErrorAttributes这个方法来获取数据内容的,跟进去看看:技术分享图片

 

 是getErrorAttributes ,这玩意其实就是 ErrorMvcAutoConfiguration 中的ConditionalOnMissingBean组件:

技术分享图片

 

 

所以我们自己加入组件ErrorAttributes,然后在组件中

 

24. SpringBoot 自定义异常信息

原文:https://www.cnblogs.com/bi-hu/p/15145491.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!