SpringBoot异常浅析

SpringBoot学习-(二十一)SpringBoot异常统一处理 SpringBoot自带的异常处理 SpringBoot默认返回的异常信息 { "timestamp": 1517369509468, "status": 500, "error": "Internal Server Error", "exception": "java.lang.IndexOutOfBoundsException", "messag 阅读详情

SpringBoot异常处理机制

1.SpringBoot默认处理异常
2.SpringBoot中如何定制错误响应
-----2.1如何定制错误的页面
-----2.2如何定制错误的json数据
-----2.3如何将我们的定制数据携带出去

1.SpringBoot默认处理异常

SpringBoot默认处理异常的页面是SpringBoot内置的异常跳转页面:如下图
在这里插入图片描述
浏览器发送请求的请求头:
在这里插入图片描述
其他客户端,这里作者使用的postMan客户端工具测试的url接口:返回的数据是一串json数据,测试如下:
在这里插入图片描述
原理:
可以参照ErrorMvcAutoConfiguration;错误处理的自动配置;
给容器中添加了以下组件
1、DefaultErrorAttributes:

//帮我们在页面共享信息;
@Override
	public Map<String, Object> getErrorAttributes(RequestAttributes requestAttributes,
			boolean includeStackTrace) {
		Map<String, Object> errorAttributes = new LinkedHashMap<String, Object>();
		errorAttributes.put("timestamp", new Date());
		addStatus(errorAttributes, requestAttributes);
		addErrorDetails(errorAttributes, requestAttributes, includeStackTrace);
		addPath(errorAttributes, requestAttributes);
		return errorAttributes;
	}

2、BasicErrorController:处理默认/error请求

@Controller
@RequestMapping("${server.error.path:${error.path:/error}}")
public class BasicErrorController extends AbstractErrorController {
    
    @RequestMapping(produces = "text/html")//产生html类型的数据;浏览器发送的请求来到这个方法处理
	public ModelAndView errorHtml(HttpServletRequest request,
			HttpServletResponse response) {
		HttpStatus status = getStatus(request);
		Map<String, Object> model = Collections.unmodifiableMap(getErrorAttributes(
				request, isIncludeStackTrace(request, MediaType.TEXT_HTML)));
		response.setStatus(status.value());
        
        //去哪个页面作为错误页面;包含页面地址和页面内容
		ModelAndView modelAndView = resolveErrorView(request, response, status, model);
		return (modelAndView == null ? new ModelAndView("error", model) : modelAndView);
	}

	@RequestMapping
	@ResponseBody    //产生json数据,其他客户端来到这个方法处理;
	public ResponseEntity<Map<String, Object>> error(HttpServletRequest request) {
		Map<String, Object> body = getErrorAttributes(request,
				isIncludeStackTrace(request, MediaType.ALL));
		HttpStatus status = getStatus(request);
		return new ResponseEntity<Map<String, Object>>(body, status);
	}

3、ErrorPageCustomizer:

@Value("${error.path:/error}")
	private String path = "/error";  系统出现错误以后来到error请求进行处理;(web.xml注册的错误页面规则)

4、DefaultErrorViewResolver:

@Override
	public ModelAndView resolveErrorView(HttpServletRequest request, HttpStatus status,
			Map<String, Object> model) {
		ModelAndView modelAndView = resolve(String.valueOf(status), model);
		if (modelAndView == null && SERIES_VIEWS.containsKey(status.series())) {
			modelAndView = resolve(SERIES_VIEWS.get(status.series()), model);
		}
		return modelAndView;
	}

	private ModelAndView resolve(String viewName, Map<String, Object> model) {
        //默认SpringBoot可以去找到一个页面?  error/404
		String errorViewName = "error/" + viewName;
        
        //模板引擎可以解析这个页面地址就用模板引擎解析
		TemplateAvailabilityProvider provider = this.templateAvailabilityProviders
				.getProvider(errorViewName, this.applicationContext);
		if (provider != null) {
            //模板引擎可用的情况下返回到errorViewName指定的视图地址
			return new ModelAndView(errorViewName, model);
		}
        //模板引擎不可用,就在静态资源文件夹下找errorViewName对应的页面   error/404.html
		return resolveResource(errorViewName, model);
	}

步骤:
一但系统出现4xx或者5xx之类的错误;ErrorPageCustomizer就会生效(定制错误的响应规则);就会来到/error请求;就会被BasicErrorController处理;
1)响应页面;去哪个页面是由DefaultErrorViewResolver解析得到的;

protected ModelAndView resolveErrorView(HttpServletRequest request,
      HttpServletResponse response, HttpStatus status, Map<String, Object> model) {
    //所有的ErrorViewResolver得到ModelAndView
   for (ErrorViewResolver resolver : this.errorViewResolvers) {
      ModelAndView modelAndView = resolver.resolveErrorView(request, status, model);
      if (modelAndView != null) {
         return modelAndView;
      }
   }
   return null;
}
2.SpringBoot中如何定制错误响应
2.1如何定制错误的页面

1)、有模板引擎的情况下;error/状态码; 【将错误页面命名为 错误状态码.html 放在模板引擎文件夹里面的 error文件夹下】,发生此状态码的错误就会来到 对应的页面;

		我们可以使用4xx和5xx作为错误页面的文件名来匹配这种类型的所有错误,精确优先(优先寻找精确的状态码.html);		

		页面能获取的信息;

			timestamp:时间戳

			status:状态码

			error:错误提示

			exception:异常对象

			message:异常消息

			errors:JSR303数据校验的错误都在这里

		2)、没有模板引擎(模板引擎找不到这个错误页面),静态资源文件夹下找;

		3)、以上都没有错误页面,就是默认来到SpringBoot默认的错误提示页面;
2.2如何定制错误的json数据

1)、自定义异常处理&返回定制json数据;

@ControllerAdvice
public class MyExceptionHandler {

    @ResponseBody
    @ExceptionHandler(UserNotExistException.class)
    public Map<String,Object> handleException(Exception e){
        Map<String,Object> map = new HashMap<>();
        map.put("code","user.notexist");
        map.put("message",e.getMessage());
        return map;
    }
}

2)、转发到/error进行自适应响应效果处理

 @ExceptionHandler(UserNotExistException.class)
    public String handleException(Exception e, HttpServletRequest request){
        Map<String,Object> map = new HashMap<>();
        //传入我们自己的错误状态码  4xx 5xx,否则就不会进入定制错误页面的解析流程
        /**
         * Integer statusCode = (Integer) request
         .getAttribute("javax.servlet.error.status_code");
         */
        request.setAttribute("javax.servlet.error.status_code",500);
        map.put("code","user.notexist");
        map.put("message",e.getMessage());
        //转发到/error
        return "forward:/error";
    }
2.3如何将我们的定制数据携带出去

出现错误以后,会来到/error请求,会被BasicErrorController处理,响应出去可以获取的数据是由getErrorAttributes得到的(是AbstractErrorController(ErrorController)规定的方法);
1、完全来编写一个ErrorController的实现类【或者是编写AbstractErrorController的子类】,放在容器中;
2、页面上能用的数据,或者是json返回能用的数据都是通过errorAttributes.getErrorAttributes得到;
容器中DefaultErrorAttributes.getErrorAttributes();默认进行数据处理的;

自定义ErrorAttributes 注意(该自定义不适合SpringBoot2.x版本以上)

//给容器中加入我们自己定义的ErrorAttributes
@Component
public class MyErrorAttributes extends DefaultErrorAttributes {

    @Override
    public Map<String, Object> getErrorAttributes(RequestAttributes requestAttributes, boolean includeStackTrace) {
        Map<String, Object> map = super.getErrorAttributes(requestAttributes, includeStackTrace);
        map.put("company","atguigu");
        return map;
    }
}

最终的效果:响应是自适应的,可以通过定制ErrorAttributes改变需要返回的内容,
在这里插入图片描述

总结:以上就是SpringBoot异常处理,和根据自己需求,对SpringBoot异常的定制和拓展,只要实现对应的类和接口即可有效的对SpringBoot进行拓展。更多SpringBoot的学习方法,你可持续关注博主,博主时长更新相关技术文章。

【SpringBoot】29、SpringBoot中定制异常页面 定制异常页面,可以避免用户产生恐慌心理,使得产品有更好的用户体验。今天来学习在 SpringBoot 中如何定制开发异常页面 一、历史回顾 在 SpringMVC 年代,我们的异常页面一般配置在 web.xml 文件中,如下: <!-- 配置404页面 --> <error-page> <error-code>404</error-code> <location>/error/404.html</location> 阅读详情

相关推荐

【SpringBoot系列】 Springboot异常处理

springboot 异常处理

我是香菜 1100

全局异常处理及自定义异常:ErrorController与@ControllerAdvice区别和用法

参考资料 springboot继承AbstractErrorController实现全局的异常处理 https://blog.csdn.net/qq_29684305/article/details/82286469 spring boot 原生错误处理ErrorController https://blog.csdn.net/shenyunsese/article/details...

jwf111的博客 1万+

海康VisionMaster表面缺陷滤波实战:从参数调优到工业检测避坑指南

本文深入探讨海康VisionMaster表面缺陷滤波技术在工业检测中的应用,从参数调优到ROI绘制与Blob分析的协同策略,提供金属外壳、锂电池铝壳等复杂表面的缺陷检测实战指南。通过多级滤波架构和动态ROI生成法,显著提升检出率至98.7%,误检率低于0.5%,为工业质检提供智能化解决方案。

ujm5678901的博客 319

springboot继承AbstractErrorController实现全局的异常处理

项目中常常需要一个全局异常,防止未处理的异常信息直接暴露给用户,影响用户体验。springboot中可以使用ControllerAdvice和ExceptionHandler这两个注解来做全局异常,这种方式比较便捷,但是也有一个问题: ContollerAdvice只能拦截控制器中的异常,换言之,只能拦截500之类的异常,但是对于404这样不会进入控制器处理的异常不起作用。所以我仿造spring...

qq_29684305的博客 1万+

浅谈天线 - - - GNSS/BT/4G/2.4G

全球定位导航系统,最成熟的就是美利坚,我大中华,俄罗斯,还有就是欧洲的一个(太次不谈)所以我们在项目调试的时候,小尺寸的陶瓷天线上一般兼容2个频段,体积大一点的可以兼容三个频段,采用组合的形式 GPS+BD GPS+GLONASS GLONASS+BD 或者是单频段的定位天线陶瓷PATC陶瓷片:陶瓷片面积越大,介电常数越大,其共振频率越高,接收效果越高,这就是为什么都推荐使用大一点的陶瓷天线的原因银层:陶瓷天线表面的银层可以影响天线的共振频率,理想的GNSS陶瓷片频点准确落在1575.42MH

BLACKHOLE6的博客 1万+

Cobalt Strike4.0安装包(内附中文版)

1.什么是 Cobalt Strike Cobalt Strike 是一个为对手模拟和红队行动而设计的平台,主要用于执行有目标的攻击和模拟高级威胁 者的后渗透行动。 Cobalt Strike已经不再使用MSF而是作为单独的平台使用,它分为客户端与服务端,服务端是一个,客户端可以有多个,可被团队进行分布式协团操作。集成了端口转发、扫描多模式端口Listener、Windows exe程序生成、W...

梦之序章的博客 2万+

AbstractErrorController

AbstractErrorController提供了多个方法可以从 request 中获取错误信息,包含以下信息: timestamp,错误发生的时 间; status,对应于HTTP Status,如 404; error,错误消息,如 Bad Request、Not Found; message,详细错误信息; exception,如果...

weixin_30482181的博客 895

AMEsim不连续处理机制:仿真精度与效率的平衡艺术

本文深入解析AMEsim不连续处理机制在系统仿真中的应用,探讨如何平衡仿真精度与效率。通过液压系统仿真案例,详细介绍了事件检测算法、变步长求解器自适应策略及典型场景优化方法,帮助工程师有效应对仿真中的不连续性问题,提升仿真效率和准确性。

v4w5x6的博客 435

「springboot 2.x 系列」exception全局异常处理

源码:https://github.com/langyastudio/langya-tech/tree/springboot/exception 使用 @ControllerAdvice 和 @ExceptionHandler 处理全局异常 使用 AbstractErrorController 处理 Controller error 级别的异常 @ControllerAdvice 可以理解为 Controller 共同逻辑的统一处理类,这样基于 @ControllerAdvice 再配合 @Exce.

郎涯技术 751

深入解析AutoConfigURL劫持:从注册表权限到一键修复

本文深入解析了AutoConfigURL劫持的原理,揭示其通过篡改注册表权限锁定浏览器设置的机制。文章提供了从手动修复注册表权限到使用一键修复工具的详细解决方案,并指导用户进行DNS检查与病毒查杀,以彻底根除此类顽固劫持问题。

weixin_29229989的博客 754

kaggle——信用卡欺诈检测项目实战

笔记第一步:了解题目,确定任务第二步:场景分析第三步:数据预处理看是否有缺失值查看样本类别分布数据不均衡解决办法数据值标准化/归一化第四步:特征工程1)查看特征分布情况,把不同类别下特征分布相差不大的特征删除掉2)特征缩放第五步:模型训练处理不平衡样本交叉验证求取最好的模型参数第六步:模型评估使用下采样数据训练与测试使用下采样数据训练与测试(不同的阈值对结果的影响)使用下采样数据训练,原始数据进行测试原始数据进行K折交叉验证使用原始数据进行训练和测试查看ROC曲线逻辑回归阈值选择过采样总结 第一步:了解题目

weixin_45942265的博客 1万+

SpringBoot之统一异常处理

详解SpringBoot统一异常处理,并结合源码剖析为什么有多个符合的异常处理方法时能匹配到最合适的异常处理方法,以及统一异常处理的优点。

. 1万+

Mamba-YOLOv8深度解析:基于状态空间模型的下一代目标检测架构(含完整代码与实战部署)文末含资料链接!

通过本文的完整指南,您将掌握从理论创新到工程落地的全流程技术细节。立即动手实践,开启目标检测的新纪元!

FJN110的博客 513

SpringBoot异常处理

把异常页面统一放在templates的error文件夹下404、500实际项目处理中会出现各种各样的异常,如果以上面的方式处理异常,我们就需要写大量的异常处理页面,太过麻烦,可以定义中一个全部异常处理页面使用了全局异常处理后原本的/error页面就会失效共有三种方法:这里举例两种一、注解自定义一个全局异常处理类,只需上面加上 @ControllerAdvice 注解同时要在执行异常处理的方法上标记@ExceptionHandler。

仰望-星空~~的博客 5219

某易将军令口令纯算法还原py篇

算法开源,将军令口令算法。希望官方多多更新吧

任雪飘的博客 3900

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

SpringBoot——全局异常处理

SpringBoot提供了两个注解用于拦截异常 1、@ControllerAdvice:标注该类为全局异常处理类,默认拦截所有被触发的异常 2、@ExceptionHandler:标注方法,用于处理特定异常

生命的痕迹 4792

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

springboot整合之统一异常处理

springboot整合实战 springboot整合之统一异常处理

qq_35771266的博客 6155

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

springboot全局异常拦截

1.异常拦截类的创建 package com.liqi.web.core.exception; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody; import org.springframew...

行天际的博客 1万+

springboot 监听所有异常_SpringBoot 全局异常处理详解

!版权声明:本博客内容均均为原创,每篇博文作为知识积累,写博不易,转载请注明出处。目录[-]相关地址:系统环境:Jdk 版本:jdk 8SpringBoot 版本:2.1.7.RELEASE一、本文简介在使用 Spring 框架开发程序时经常要写接口,尤其现在 SpringBoot 更推荐用 Restful 风格来写接口,在我们写接口中经常遇见的问题就是调用接口后,执行逻辑过程中报错,产生一堆异常...

weixin_36294852的博客 1646

Springboot如何处理异常

Springboot如何处理异常 文章目录一、springb默认处理异常的方式二、使用@ExceptionHandler注解处理三、使用@ControllerAdvice+@ExceptionHandler全局异常处理四、SimpleMappingExceptionResolver处理全局异常五、自定义 HandlerExceptionResolver 类处理异常 一、springb默认处理异常的方式   SpringBoot提供了一套默认的处理异常的机制,使用时只需自定义错误页面即可。  .

weixin_53059756的博客 2457

【Springboot系列】SpringBoot如何优雅地实现一个错误异常捕捉

在很多业务场景下,我们可能需要自定义一些异常类,来反映特定的业务错误。自定义异常不仅能让代码更清晰,还能方便我们对不同的业务异常进行分类处理。首先,我们定义一个自定义的。接着,我们在@Service// 模拟用户未找到的情况throw new UserNotFoundException("用户未找到");当方法找不到用户时,它将抛出,并在中捕捉并处理这个异常。我们可以定义一个类来封装错误响应信息。接着,我们修改全局异常处理器,返回。"详细的错误描述,比如定位到的错误字段等"

小蜗牛的珍贵百宝箱 1632

SpringBoot 优雅的处理异常

SpringBoot 统一异常处理 像这种统一异常的文章博客有许多,但是每个人使用都有自己的心得,我来总结一下自己使用的心得 统一异常,顾名思义,就是统一管理项目中会方法的异常,然后进行一个处理,Spring发生错误后,底层会去请求一个/error的地址,抛出对应的异常到页面上,对客户或者开发来说都不是特别的友好 使用统一异常处理的话,可以返回自定义的异常数据,阅读性提高,优雅的处理异常 使用异常...

如漩涡的博客 1611

Java异常、SpringBoot中全局捕获处理异常

为了封装异常和快速定位异常,我们可以自定义异常。自定义异常通常继承于Exception或,到底继承那个应该看具体情况来定。自定义异常类可以有自己的变量和方法来传递错误代码或传递其它异常相关信息。实际工作中,都会自定义异常类来处理异常。widows: 2;// 调用父类的默认构造函数super();}// 手动调用父类的构造方法}}widows: 2;// 调用父类的默认构造函数super();}// 手动调用父类的构造方法}}手动抛出异常(伪代码)。...

weixin_62421895的博客 2123

springBoot异常处理

定义404等错误页面 在resources下新建一个resources.error文件夹,下面建一个404.html 访问工程中一个不存在的路径 自定义异常抛出 自定义一个异常 @Data public class MusicEntryNotFoundException extends RuntimeException { private String keyWords...

3954

SpringBoot 处理异常的几种方法

1. 使用 @ControllerAdvice 和 @ExceptionHandler 处理全局异常 ①新建异常实体类 public class ErrorResponse { private String message; private String errorTypeName; public ErrorResponse(Exception e) { this(e.getClass().getName(), e.getMessage()); }

tianynnb的博客 4858
上一篇: SpringBoot框架自动配置原理
下一篇: Docker无法启动异常解决
Coding工匠
博客等级 码龄12年 7708粉丝 73原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Coding工匠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值