14、SpringBoot-CRUD错误处理机制(1)

一、springboot默认的处理机制

1.浏览器返回一个错误的页面

默认处理错误:返回一个错误的页面:

包括错误类型、时间......

2.其他客户端访问

默认响应一个json数据

原理:

错误自动配置的类:ErrorMvcAutoConfiguration.java

默认配置:

@Bean
@ConditionalOnMissingBean(
    value = {ErrorAttributes.class},
    search = SearchStrategy.CURRENT
)
public DefaultErrorAttributes errorAttributes() {
    return new DefaultErrorAttributes(this.serverProperties.getError().isIncludeException());
}

@Bean
@ConditionalOnMissingBean(
    value = {ErrorController.class},
    search = SearchStrategy.CURRENT
)
public BasicErrorController basicErrorController(ErrorAttributes errorAttributes) {
    return new BasicErrorController(errorAttributes, this.serverProperties.getError(), this.errorViewResolvers);
}

@Bean
public ErrorMvcAutoConfiguration.ErrorPageCustomizer errorPageCustomizer() {
    return new ErrorMvcAutoConfiguration.ErrorPageCustomizer(this.serverProperties, this.dispatcherServletPath);
}

@Bean
@ConditionalOnBean({DispatcherServlet.class})
@ConditionalOnMissingBean
public DefaultErrorViewResolver conventionErrorViewResolver() {
    return new DefaultErrorViewResolver(this.applicationContext, this.resourceProperties);
}

1、DefaultErrorAttributes:

在页面共享信息
public Map<String, Object> getErrorAttributes(ServerRequest request, boolean includeStackTrace) {
    Map<String, Object> errorAttributes = new LinkedHashMap();
    errorAttributes.put("timestamp", new Date());
    errorAttributes.put("path", request.path());
    Throwable error = this.getError(request);
    HttpStatus errorStatus = this.determineHttpStatus(error);
    errorAttributes.put("status", errorStatus.value());
    errorAttributes.put("error", errorStatus.getReasonPhrase());
    errorAttributes.put("message", this.determineMessage(error));
    this.handleException(errorAttributes, this.determineException(error), includeStackTrace);
    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 = this.getStatus(request);
    Map<String, Object> model = Collections.unmodifiableMap(this.getErrorAttributes(request, this.isIncludeStackTrace(request, MediaType.TEXT_HTML)));
    response.setStatus(status.value());

    //去哪个页面作为错误页面,包含页面地址和页面内容
    ModelAndView modelAndView = this.resolveErrorView(request, response, status, model);
    return modelAndView != null ? modelAndView : new ModelAndView("error", model);
}

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

3、ErrorPageCustomizer:

public class ErrorProperties {
@Value("${error.path:/error}")
private String path = "/error";
public String getPath() {
    return this.path;
}
...
}

4、DefaultErrorViewResolver:

public ModelAndView resolveErrorView(HttpServletRequest request, HttpStatus status, Map<String, Object> model) {
    ModelAndView modelAndView = this.resolve(String.valueOf(status.value()), model);
    if (modelAndView == null && SERIES_VIEWS.containsKey(status.series())) {
        modelAndView = this.resolve((String)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);
    ///模板引擎不可用,就在静态资源文件夹下找errorViewName对应的页面
    return provider != null ? new ModelAndView(errorViewName, model) :
 this.resolveResource(errorViewName, model);
}

步骤:

一但系统出现4xx或者5xx之类的错误;ErrorPageCustomizer就会生效(定制错误的响应规则);

就会来到/error请求,就会被BasicErrorController进行处理

1)响应页面(resolveErrorView方法)去那个页面是由DefaultErrorViewResolver解析得到的

protected ModelAndView resolveErrorView(HttpServletRequest request,
HttpServletResponse response, HttpStatus status, Map<String, Object> model) {
    //所有的ErrorViewResolver得到ModelAndView
    Iterator var5 = this.errorViewResolvers.iterator();
    ModelAndView modelAndView;
    do {
        if (!var5.hasNext()) {
            return null;
        }
        ErrorViewResolver resolver = (ErrorViewResolver)var5.next();
        modelAndView = resolver.resolveErrorView(request, status, model);
    } while(modelAndView == null);
    return modelAndView;
}

原文地址:https://www.cnblogs.com/Mrchengs/p/10357004.html

时间: 2024-10-22 17:19:45

14、SpringBoot-CRUD错误处理机制(1)的相关文章

Springboot 错误处理机制

SpringBoot默认的错误处理机制 即我们常见的白色的ErrorPage页面 浏览器发送的请求头: 如果是其他的请求方式,比如客户端,则相应一个json数据: 原理:是通过 ErrorMvcAutoConfiguration,错误处理的自动配置: 给容器中添加了以下组件 1.DefaultErrorAttributes: 帮我们在页面共享信息: @Override public Map<String, Object> getErrorAttributes(RequestAttributes

五、错误处理机制

1.默认的错误处理机制 SpringBoot在页面请求发生错误的时候,会返回一个默认的页面,如下图: 浏览器做为客户端 如果使用的是浏览器做为客户端来访问接口,那么在浏览器的请求头中会有 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 其他客户端 Accept: */* 默认响应一个Json数据 { "timestamp": 15383817709

linux系统编程之错误处理机制

在讲解liunx错误处理机制之前我们先来看一段代码: 1 #include<sys/types.h> 2 #include<sys/stat.h> 3 #include<fcntl.h> 4 #include<stdio.h> 5 #include<stdlib.h> 6 7 int main(void) 8 { 9 int fd; 10 fd=open("abc",O_WRONLY); 11 if(fd<0){ 12

Map/Reduce 工作机制分析 --- 错误处理机制

前言 对于Hadoop集群来说,节点损坏是非常常见的现象. 而Hadoop一个很大的特点就是某个节点的损坏,不会影响到整个分布式任务的运行. 下面就来分析Hadoop平台是如何做到的. 硬件故障 硬件故障可以分为两种 - JobTracker节点损坏和TaskTracker节点损坏. 1. JobTracker节点损坏 这是Hadoop集群中最为严重的错误. 出现了这种错误,那就只能重新选择JobTracker节点,而在选择期,所有的任务都必须停掉,而且当前已经完成了的任务也必须通通重来. 2.

php中的错误处理机制

1.如果没有错误处理机制会怎样? 案例1: <?php  $fp=fopen("aa.txt","r");//打开文件,没有验证,是否存在该文件?  echo "ok";   ?> 结果: Warning: fopen(aa.txt) [function.fopen]: failed to open stream: No such file or directory in E:\Software_default\wamp_wwwroo

关于面向切面编程的部分内容-错误处理机制

错误处理机制. 面对多个web服务器,多线程处理,我们想把错误信息记录到一个txt文档中. 但是把错误信息写到内存是很快.写到硬盘上就有一堆的问题.比如说读写慢.并发问题. 今天我们就利用这个实现错误处理 此文以MVC为例 1.首先要在  golable  文件的  protected void Application_Start() 注册一个错误处理机制. MVC中自带一个  过滤器 FilterConfig.RegisterGlobalFilters(GlobalFilters.Filter

php中错误处理机制

php中,异常处理机制是有限的,无法自动抛出异常,必须手动进行,并且内置异常有限. php把许多异常看作错误,这样就可以把这些异常想错误一样用set_error_handler接管,进而主动抛出异常. 比如以下warning类型的错误是捕获不到的 :   Warning: Division by zero in 1 try{ 2 $a = 5/0; 3 }catch (Exception $e){ 4 echo '错误信息:',$e->getMessage(); 5 } 使用set_error_

hadoop 错误处理机制

hadoop 错误处理机制 1.硬件故障 硬件故障是指jobtracker故障或TaskTracker 故障 jobtracker是单点,若发生故障,目前hadoop 还无法处理,唯有选择最牢靠的硬件作为jobtracker jobtracker通过心跳(周期1分钟) 信号来了解TaskTracker 是否发生故障或者负载过重 jobtracker 将从任务节点列表中移除发生故障的TaskTracker 如果故障节点在执行map任务并且尚未完成,jobtracker 会要求其他节点 重新执行 次

最全Pycharm教程(23)——Pycharm编辑器功能之代码高亮显示及错误提示机制

1.代码高亮显示 当你在编辑框中输入代码时,Pycharm会在后台对其进行分析.这个IDE能够智能的识别出关键字.变量.字符串.注释等,并以不同的字体颜色进行显示.Pycharm的符号配色方案定义在 Colors and Fonts settings中(Ctrl+Alt+S→IDE Settings→Editor→Color and Fonts). 我们先选择编程语言,这里选择Python,然后根据个人习惯来设置字符配色方案.然而这里Pycharm自带的配色方案是不可更改的,我们需要先创建一个拷