Spring boot 错误处理机制

请求方式时,若不存在

  浏览器出现White label Error Page 错误页面

  其他客户端出现响应一个JSON格式文本包含错误码等信息

浏览器发送请求的请求头:

客户端请求头

这样就能区分来自哪..

原理:ErrorMvcAutoconfiguration 处理错误的自动配置

里面添加了以下组件

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;
    }
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);
    }
ErrorPageCustomizer (系统出现错误4xx,5xx等错误)来到/error请求
@Value("${error.path:/error}")
    private String path = "/error";  系统出现错误以后来到error请求进行处理;(web.xml注册的错误页面规则)
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;
}

原文地址:https://www.cnblogs.com/eason-d/p/9313911.html

时间: 2024-10-04 15:44:23

Spring boot 错误处理机制的相关文章

spring boot错误: 找不到或无法加载主类

一:当在eclipse启动spring boot项目时出现问题: springboot错误: 找不到或无法加载主类 解决办法: 1,通过cmd命令行,进入项目目录进行,mvn clean install 进行编译 项目install后,再到eclipse 上选中项目按F5刷新项目.再运行即可问题解决. 2,在eclipse 上选中项目 点击clean 清理项目再运行 问题解决. 3,如果运行还是出现无法加载主类, (a)排查项目代码是否有问题, (b)可以进入cmd,  cd 进入项目目录 执行

Spring boot 错误页面

  默认效果:1).浏览器,返回一个默认的错误页面 1.1 请求头 1.2返回结果 2).如果是其他客户端,默认响应一个json数据 2.1请求头 2.2返回结果 步骤: 1)系统出现4xx或者5xx之类的错误:ErrorPageCustomizer就会生效(定制错误的响应规则): 2) 根据相应规则来到/error请求:被BasicErrorController处理: 3)响应页面:被Controller处理后去哪个页面是由DefaultErrorViewResolver解析得到的: 源码解析

spring boot 错误,求大神帮解决

Exception in thread "main" java.lang.IllegalStateException: Failed to read Class-Path attribute from manifest of jar file:/C:/Users/wo/.m2/repository/com/amazonaws/aws-java-sdk-core/1.11.125/aws-java-sdk-core-1.11.125.jar    at org.springframewo

Spring boot错误处理以及定制错误页面

如果是浏览器访问,返回错误页面 注意浏览器发送请求的请求头:  注意区别其他客户端哦比如 postman 如果是其他客户端,返回一个Json数据 原理可以参照ErrorMvcAutoConfiguration:错误处理的自动配置: 给容器中添加了以下组件1.DefaultErrorAttributes: 2.BasicErrorController:处理默认/error请求 3.ErrorPageCustomizer: 4.DefaultErrorViewResolver: 步骤:一但系统出现4

spring boot 错误页面配置

如果访问了错误的路径,或者后台报错 如果没有一个统一的页面! 或者说页面上展示一堆报错信息,既影响美观,又对用户不友好! 那么如何配置? 定义 ErrorPageConfig,配置错误状态与对应访问路径 @Component public class ErrorPageConfig implements ErrorPageRegistrar { private static final Logger logger = LoggerFactory.getLogger(ErrorPageConfig

Spring Boot 扩展点应用之工厂加载机制

Spring 工厂加载机制,即 Spring Factories Loader,核心逻辑是使用 SpringFactoriesLoader 加载由用户实现的类,并配置在约定好的META-INF/spring.factories 路径下,该机制可以为框架上下文动态的增加扩展. 该机制类似于 Java SPI,给用户提供可扩展的钩子,从而达到对框架的自定义扩展功能. 核心实现类 SpringFactoriesLoader SpringFactoriesLoader 是 Spring 工厂加载机制的核

spring boot +mybatis 操作sqlite数据库

前言 第一次写博客,以前遇到技术问题都是百度,google搜索也解决了我不少问题,需要搜索老半天七拼八凑才能找到解决方案,一直使用从不生产对学习的过程总结也没记录. 今天写该博客主要是让自己更学入了解spring boot里面的机制,同时让新人少走弯路. 环境 java8+spring boot 数据库:sqlite ORM框架:mybatis sqlite 不多介绍了,基于文件格式的数据库,无需安装数据库执行引擎,方便部署. 主要依赖与版本 <groupId>org.mybatis.spri

spring boot配置写法

转自:http://blog.csdn.net/mickjoust/article/details/51646658 每日金句 你要搞清楚自己人生的剧本:不是你父母的续集,不是你子女的前传,更不是你朋友的外篇.对待生命你不妨大胆冒险一点,因为好歹你要失去它.——源自尼采 题记 上面的金句是被转载很多的一句话,spring Boot也有自己的舞台,只是这个舞台还没有大量展开.今天接着上一篇的内容开始正式的切入到Spring Boot,按照从Spring mvc里的xml配置导入使用到class类配

Spring Boot启动过程及回调接口汇总

Spring Boot启动过程及回调接口汇总 链接: https://www.itcodemonkey.com/article/1431.html 来自:chanjarster (Daniel Qian) 注:本文基于spring-boot 1.4.1.RELEASE, spring 4.3.3.RELEASE撰写. 启动顺序 Spring boot的启动代码一般是这样的: 1 2 3 4 5 6 @SpringBootApplication public class SampleApplica