009错误处理(代码片段)

trekxu trekxu     2023-01-05     698

关键词:

一 .概述

  在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 查看详情