SpringBoot默认的错误处理机制

错误处理机制:

访问一个不存在的页面时,或者程序抛出异常时

默认效果

  • 浏览器返回一个错误的页面,注意查看浏览器发送请求的请求头

  • 可以使用专业的软件比如postman分析返回的json数据

springboot错误处理的自动配置信息

主要给日容器中注册了以下组件:

  • ErrorPageCustomizer 系统出现错误以后来到error请求进行处理;相当于(web.xml注册的错误页面规则)
  • BasicErrorController 处理/error请求
  • DefaultErrorViewResolver 默认的错误视图解析器
  • DefaultErrorAttributes 错误信息
  • defaultErrorView 默认错误视图

@getErrorAttributes()返回的参数

  • timestamp:时间戳
  • status:状态码
  • error:错误提示
  • exception:异常对象
  • message:异常消息
  • errors:JSR303数据校验的错误都在这里

2.0以后默认是不显示exception的,需要在配置文件中开启

server.error.include-exception=true

如何定制JSON数据

springboot做了自适应效果,浏览器访问响应错误页面。客户端访问响应错误信息的json数据

  1. 第一种方法,定义全局异常处理器类注入到容器中,捕获到异常返回json格式的数据

    @ControllerAdvice
    public class MyExceptionHandler {@ResponseBody@ExceptionHandler(Exception.class)public Map<String, Object> handleException(Exception e) {Map<String, Object> map = new HashMap(2);map.put("code", "100011");map.put("msg", e.getMessage());return map;}
    }
  2. 由上面我们已经知道数据的来源是调用DefaultErrorAttributes的getErrorAttributes方法得到的,而这个DefaultErrorAttributes是在ErrorMvcAutoConfiguration配置类中注册的,并且注册之前会检查容器中是否已经拥有
        @Bean@ConditionalOnMissingBean(value = {ErrorAttributes.class},search = SearchStrategy.CURRENT)public DefaultErrorAttributes errorAttributes() {return new DefaultErrorAttributes(this.serverProperties.getError().isIncludeException());}

所以我们可以只要实现ErrorAttributes接口或者继承DefaultErrorAttrites类,然后注册到容器中就行了

@ControllerAdvice
public class MyExceptionHandler {@ExceptionHandler(Exception.class)public String handleException(Exception e, HttpServletRequest request) {Map<String, Object> map = new HashMap(2);map.put("name", "hello");map.put("password", "123456");//设置状态码request.setAttribute("javax.servlet.error.status_code", 500);//把数据放到request域中request.setAttribute("ext", map);return "forward:/error";}
}
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {@Beanpublic DefaultErrorAttributes errorAttributes() {return new MyErrorAttributes();}class MyErrorAttributes extends DefaultErrorAttributes {@Overridepublic Map<String, Object> getErrorAttributes(WebRequest webRequest, boolean includeStackTrace) {//调用父类的方法获取默认的数据Map<String, Object> map = new HashMap<>(super.getErrorAttributes(webRequest, includeStackTrace));//从request域从获取到自定义数据Map<String, Object> ext = (Map<String, Object>) webRequest.getAttribute("ext", RequestAttributes.SCOPE_REQUEST);map.putAll(ext);return map;}}......

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/447358.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GitHub政府用户破万:开源成重塑政府新手段

据GitHub官方博客介绍&#xff0c;目前GitHub上的各地政府用户数量已经达到1万个&#xff01; 2009年&#xff0c;纽约参议院正式入驻GitHub公开部分技术资料与文档&#xff0c;成为GitHub上的第一个政府组织。随后&#xff0c;美国华盛顿特区、迈阿密、芝加哥、纽约&#xff…

云OS:Linux在桌面打翻身仗的机会?

不可否认&#xff0c;Chrome OS取得了惊人的增长。Chromebook自发行以来&#xff0c;迅速席卷全球&#xff0c;常年位居最畅销笔记本榜首。这款基于Linux的笔记本在合适时间提供了合适的解决方案。很多情况下&#xff0c;云不仅仅是一个可选项&#xff0c;而是一个最优选项。Li…

Docker容器基本使用

Dcoker Docker是一个开源的应用容器引擎&#xff0c;是一个轻量级别的容器技术Dcoker支持将软件编译成一个镜像&#xff1b;然后在镜像中对各种软件做好配置&#xff0c;再将镜像发布出去&#xff0c;供别人使用运行中的镜像称为容器&#xff0c;容器的启动是非常快速的核心概…

为什么35岁的C++依然能主导编程世界

早在1979年&#xff0c;Bjarne Stroustrup设计了C编程语言&#xff0c;并且C很快成为了无处不在的通用系统编程语言。现在尽管有Java、Javascript、Python、Go&#xff0c;甚至是苹果的Swift和它竞争&#xff0c;但C依然处于主导编程世界的地位。 今天在Morgan Stanley的科技访…

SpringBoot整合JPA

添加依赖 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId&…

为什么说选择正确的编程语言很重要,以及如何正确的选择

几个月前&#xff0c;一个同事问我&#xff0c;应该如何选择编程语言&#xff0c;或者有没有什么固定的选择模式&#xff0c;当时我便打算写点什么。上周在硅谷开会&#xff0c;这我是第一次跟“hack3rs”的创业狂以及技术狂们打交道。我学会了很多前所未闻的脏话&#xff0c;也…

细数开源历史上的十个重大事件

开放源码&#xff08;开源&#xff09;的精神在于使用者可以使用、复制、散布、研究和改进软件。这可以追溯到20世纪60年代&#xff0c;至今已有半个世纪了。虽然下面所列举的不都是专门的开源产品&#xff0c;但还是在开源发展的进程中有着巨大的影响。开放源码&#xff08;开…

深度卷积神经网络CNNs的多GPU并行框架及其应用

摘要&#xff1a;本文是腾讯深度学习系列文章之一&#xff0c;主要聚焦于腾讯深度学习平台&#xff08;Tencent Deep Learning Platform&#xff09;中深度卷积神经网络Deep CNNs的多GPU模型并行和数据并行框架。 【编者按】深度卷积神经网络有着广泛的应用场景&#xff0c;本…

线程安全和对应的核心概念

线程安全 线程安全的概念&#xff1a;当多个线程访问某一个类&#xff08;对象和方法&#xff09;时&#xff0c;这个类始终都能表现出正确的行为&#xff0c;那么这个类&#xff08;对象或者方法&#xff09;就是线程安全的synchronized&#xff1a;可以在任意对象及方法上加…

JDK Unsafe类的使用与CAS原子特性

JDK Unsafe类的使用与CAS原子特性 Java.util.concurrent.atomic包&#xff0c;其中包含了大量使用到Unsafe这个类Java不能直接访问操作系统的底层&#xff0c;而是通过本地方法来访问。 Unsafe类提供了硬件级别的原子操作&#xff0c;主要提供了以下功能 内存操作字段的定位和…

写软件不是造汽车

写软件和做其他事情是不一样的。当我们制造别的东西的时候——像汽车、玩具、椅子、画作、甚至包括数字产品如平面图片和3D模型——我们做出来的成品就是最终的结果。而开发软件则不是&#xff0c;我们做出来的产品永远不可能有最终的结果——我们需要向计算机解释如何根据任意…

网站盈利的10种方式

如果你有自己的网站&#xff0c;而且已经有了不少的流量&#xff0c;你肯定会开始考虑如何通过这个网站来挣一些钱。 在这篇文章中&#xff0c;我会向大家介绍网站最常见的10种盈利方式。 1.按点击付费广告 在网站上展示一个按点击付费的广告横幅是最简单的盈利方式&#xff…

Redis数据的类型

Redis一共分为五种基本数据类型&#xff1a;String、Hash、List、Set、Zset. string 内部编码有三种&#xff0c;raw&#xff0c;embstr&#xff0c;int String 是二进制的。可以存储序列化对象&#xff0c;图片&#xff0c;字符串&#xff0c;数值等 set和get方法 &#x…

Redis高级命令与特性以及单点模式的介绍

高级命令 keys * 返回满足条件的所有key&#xff0c;可以模糊匹配exists 是否存在指定的keypersist 取消过期时间select 选择数据库 &#xff08;0-15&#xff0c;总共16个数据库&#xff09;move key index 将当前数据库的 key 移动到给定的数据库 db 当中randomkey 随机返回…

同为程序员 为什么我的工资最低

我看着工资单上每一个开发团队成员的薪水&#xff0c;慢慢地我不能保持淡定了。 而当我看到我的工资排名是倒数的时候——靠近最后一名——我不由得倒抽一口冷气。就像圣诞故事中的那个可爱的小男孩Ralphie &#xff0c;想买气枪却被忽悠会有危险一样&#xff0c;我也不断忽悠…

redis.conf配置文件详解

基本配置 daemonize no #是否以后台进程启动databases 16 #创建database的数量(默认选中的是database 0)save 900 1 #刷新快照到硬盘中&#xff0c;必须满足两者要求才会触发&#xff0c;即900秒之后至少1个关键字发生变化save 300 10 #必须是300秒之后至少10个关键字发生变…

用Unix的设计思想来应对多变的需求

摘要&#xff1a;无论是Unix设计&#xff0c;还是面向对象设计&#xff0c;还是别的什么如SOA&#xff0c;ECB&#xff0c;消息&#xff0c;事件&#xff0c;MVC&#xff0c;网络七层模型&#xff0c;数据库设计&#xff0c;等等&#xff0c;他们都在干三件事——解耦&#xff…

有关编程的12个猜想

摘要&#xff1a;编程世界的将来如何目前仍难预料&#xff0c;但可以肯定的一点是技术一直在加速发展。本文搜罗出12个独特的编程视角猜想&#xff0c;一起来看看有哪些猜想在不久的将来就能变为现实。 编程世界的将来如何目前仍难预料&#xff0c;但可以肯定的一点是技术一直…

面试中如何剔除“鱼目混珠”程序员?

公司招聘面试事宜是一个耗时耗钱的项目&#xff0c;从挑选简历开始&#xff0c;还要花更多的时间面试候选人。有的时候这些人才机构会向你保证这些人都是Java天才、SQL专家、堆栈开发者等等&#xff0c;但实际上真实情况远不及你想想的。对于一个公司来说&#xff0c;执行招聘面…

java容器相关问题

同步类容器 1&#xff0c;这些复合操作在多线程并发地修改容器时&#xff0c;可能会表现出意外的行为&#xff0c;最经典的便是ConcurrentModificationException&#xff0c;原因是当容器迭代的过程中&#xff0c;被并发的修改了内容&#xff0c;这是由于早期迭代器设计的时候…