关键词:
一 .概述
在springboot之中,为我们的默认的错误处理进行了默认的配置,本此我们来看看错误处理的方式.
二 .错误处理的原理
我们首先找到错误的动配置类之中.
@Configuration @ConditionalOnWebApplication @ConditionalOnClass( Servlet.class, DispatcherServlet.class ) // Load before the main WebMvcAutoConfiguration so that the error View is available @AutoConfigureBefore(WebMvcAutoConfiguration.class) @EnableConfigurationProperties(ResourceProperties.class) public class ErrorMvcAutoConfiguration
我们发现配置信息应该在ResourceProperties在中.
我们现在看看这个自动配置向容器之中添加了什么组件.
@Bean @ConditionalOnMissingBean(value = ErrorAttributes.class, search = SearchStrategy.CURRENT) public DefaultErrorAttributes errorAttributes() return new DefaultErrorAttributes();
添加了一个错误属性的组件.
@Bean @ConditionalOnMissingBean(value = ErrorController.class, search = SearchStrategy.CURRENT) public BasicErrorController basicErrorController(ErrorAttributes errorAttributes) return new BasicErrorController(errorAttributes, this.serverProperties.getError(), this.errorViewResolvers);
添加了一个基本的错误处理器组件.
@Bean public ErrorPageCustomizer errorPageCustomizer() return new ErrorPageCustomizer(this.serverProperties);
添加一个错误页的组件.
@Bean public static PreserveErrorControllerTargetClassPostProcessor preserveErrorControllerTargetClassPostProcessor() return new PreserveErrorControllerTargetClassPostProcessor();
添加了一个PostProcessor组件.
@Configuration static class DefaultErrorViewResolverConfiguration private final ApplicationContext applicationContext; private final ResourceProperties resourceProperties; DefaultErrorViewResolverConfiguration(ApplicationContext applicationContext, ResourceProperties resourceProperties) this.applicationContext = applicationContext; this.resourceProperties = resourceProperties; @Bean @ConditionalOnBean(DispatcherServlet.class) @ConditionalOnMissingBean public DefaultErrorViewResolver conventionErrorViewResolver() return new DefaultErrorViewResolver(this.applicationContext, this.resourceProperties);
上面配置了一个错误视图解析器.
当我们的系统之中出现了异常,比如4XX或者5XX的时候,首先会找到一个错误的页面进行处理.
我们可以从下面看到就是去了/error错误的页面.
@Value("$error.path:/error") private String path = "/error";
然后就是错误处理器进行处理了.
@Controller @RequestMapping("$server.error.path:$error.path:/error") public class BasicErrorController extends AbstractErrorController
我们发现这个错误处理器正好处理的就是/error的请求.
这样就会进行下面的两个处理方式.
@RequestMapping(produces = "text/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 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);
其中,一个就是处理页面的错误,另外一个就是处理其他设备的请求错误.
那么,这些错误信息都存放在哪里了呢?
DefaultErrorAttributes这个组件帮助我们存放了错误的信息.
三.自定义错误信息
[1]页面请求
springboot会帮助我们将浏览器的请求转换到4xx.html或者5xx.html页面之中,这个页面需要存在在error文件夹下面.
看下面的实验:
我们在我们的templates的error里面定义两个页面,一个是4xx.html页面,另外一个就是5xx.html页面.
当我们使用浏览器访问的时候,就会根据错误跳转到不同的页面上.[这个需要视图解析器的支持].
通过这种方式,我们就能完成页面请求的显示了.
[2]在上面我们说到,我们将异常信息存放在DefaultErrorAttributes之中.
另外我们可以使用@ControllerAdvice中添加一个HandlerException进行处理,但是这种方式无法区分是页面请求,还是json请求.
我们就需要进行判断.
我们可以根据produces进行判断,或者我们使用请求转发到/error的请求路径上.
[3]如果需要自定义错误的信息,我们就向容器之中添加一个DefaultErrorAttributes就可以了.
四 .自定义的实例
@Component public class ExceptionHandlerConfig implements HandlerExceptionResolver @Override public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) // 在这里我们能够完成异常的解析工作,这是比较重要的. // 重定向到springboot为我们做的一个错误处理器. ModelAndView mv = new ModelAndView("forword:/error"); return mv;
我们首先定义一个异常解析器,这个异常解析器的核心就是需要将请求转发到/error之中,这样我们就能使用springboot的默认的错误处理机制.
@Component public class ErrorAttributesEnhance extends DefaultErrorAttributes @Override public Map<String, Object> getErrorAttributes(RequestAttributes requestAttributes, boolean includeStackTrace) // 获取父类之中的错误的属性 Map<String, Object> errorAttributes = super.getErrorAttributes(requestAttributes, includeStackTrace); //然后我们可以对这个map进行处理,添加或者删除 return errorAttributes;
添加一个异常属性处理存储器,我们可以调用父类获取一些错误的信息,然后可以对这个map进行添加和删除属性.
009字符串和编码(代码片段)
...字符串比较特殊的是还有一个编码问题。因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理。最早的计算机在设计时采用8个比特(bit)作为一个字节(byte),所以,一个字节能表示的最大的整数... 查看详情
009天之跨浏览器的事件处理程序(代码片段)
为了以?跨浏览器方式处理事件,我们可以使用一些可以隔离浏览器差异的js库。由于业务需求,有时候我们需要写一些我们自己封装一些兼容代码。比如创建一个addHandler(),它的职责是视情况分别使用DOM0级方法,DOM2级方法或IE方... 查看详情
[单调栈]aw3780.构造数组(递推+单调栈+枚举+aw周赛009_3)(代码片段)
...析1.题目来源链接:3780.构造数组2.题目解析难题。预处理+递推+单调栈优化,考验码力啊。题意就是:构造一个先增后减的序列,保证没有凹下去的情况。需要枚举每一个顶点作为山峰,直接暴力枚举会... 查看详情
textdailyui#009|音乐播放器(代码片段)
rubyrubysteps009-oop-eastyoop(摘录)(代码片段)
009.kvm配置调整(代码片段)
一内存CPU调整1.1增大虚拟机内存1[[email protected]~]#virshshutdownvm01-centos6.82[[email protected]~]#virsheditvm01-centos6.83……4<memoryunit=‘KiB‘>4194304</memory>5<currentMemoryunit=‘KiB‘ 查看详情
009-快速构建一个业务模块(代码片段)
视频讲解地址:009-快速构建一个业务模块(3)_哔哩哔哩_bilibili009-快速构建一个业务模块(3)https://www.bilibili.com/video/BV1w34y1i7dp?spm_id_from=333.999.0.0本演示讲解一个模拟业务模块从导入到配置的过程,使您可以快速了解本系统... 查看详情
009-快速构建一个业务模块(代码片段)
视频讲解地址:009-快速构建一个业务模块(3)_哔哩哔哩_bilibili009-快速构建一个业务模块(3)https://www.bilibili.com/video/BV1w34y1i7dp?spm_id_from=333.999.0.0本演示讲解一个模拟业务模块从导入到配置的过程,使您可以快速了解本系统... 查看详情
009死锁(代码片段)
一.概述 死锁是一种状态: 多个线程争夺多个锁,如果控制不当,每个线程都获得一部分锁而无法获取所有的全部的锁,此时就会发生死锁. 在一般状态下,死锁在没有外界的干预下会一直陷入到等待当中,也就是说,程序... 查看详情
009-流程控制for语句(代码片段)
流程控制for语句#####################语法一##################################!/bin/bashforiin123456doecho$idone#!/bin/bash#批量解压缩cd/lampls*.tar.gz>ls.logforiin`catls.log`dotarxzf$i&>/dev/nulldonerm-fr/ 查看详情
009通知类型(代码片段)
一.概述 我们在使用AspectJ的时候定义了五种基本的增强方式. 本节就介绍一下这五种基本的增强方式. 二,前置增强 @Before(value="exp()")我们使用@Before表示前置通知,表示在连接点方法之前执行. 这个很很好理解.三,... 查看详情
009客户端编码(代码片段)
一.概述 Rabbitmq的java客户端的API是本人见过的最垃圾的API的设计,没有之一. 在这些API之中,竟然使用了方法的重载代表了不同的行为,这也是服气到不行. 二.消息的发布 我们首先看看核心的API: voidbasicPublish(Stringex... 查看详情
009waitnotify等方法(代码片段)
一.概述 当我们实现了原子性操作的时候,我们又会遇到一个问题,那就是线程之间通信的问题.所谓的线程通信,指的就是线程间的执行顺序是需要进行一定的控制的. 我们拿最经典的生产者和消费者模型进行说明:privatestaticO... 查看详情
009_一个englishnativespeaker掌握多少单词量(代码片段)
Google"howmanywordsdoesanativespeakerknow"一、anaverageof20,000to30,000vocabularywords①Evenwithintensivestudy,howmanywordsdonon-nativespeakersknow?⑴TheresearchersfoundthatnativeadultspeakersofEnglishund 查看详情
009-http_01(代码片段)
请求头:(下面10行都是请求头)GET/index.htmlHTTP/1.1这两行比较重要GET/classic.cssHTTP/1.1Host:127.0.0.1:8997Connection:keep-aliveUser-Agent:Mozilla/5.0(X11;Linuxx86_64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/65.0.3325.1 查看详情
009格式化(代码片段)
一:1.字符串的格式化方法1#####位置格式化2a="0and1".format(‘tom‘,‘bob‘)3print(a)45###6a="xandy".format(x=‘tom‘,y=‘bob‘)7print(a)89a="0andyandz".format(‘tom‘,y=‘bob‘,z=‘jack‘)10print(a)1112####数字格式化,:是格式化 查看详情
c_cppcpp-教程009-lambda表达式(代码片段)
webservice009——服务说明映射文件的修改(代码片段)
ThisXMLfiledoesnotappeartohaveanystyleinformationassociatedwithit.Thedocumenttreeisshownbelow.<!--PublishedbyJAX-WSRI(http://jax-ws.java.net).RI'sversionisJAX-WSRI2.2.9-b130926.1035svn-revision 查看详情