源码分析

在springboot中默认有一个异常处理器接口ErrorContorller,该接口提供了getErrorPath()方法,此接口的BasicErrorController实现类实现了getErrorPath()方法,如下:

/*

* AbstractErrorController是ErrorContoller的实现类

*/

@Controller

@RequestMapping("${server.error.path:${error.path:/error}}")

public class BasicErrorController extends AbstractErrorController {

private final ErrorProperties errorProperties;

...

@Override

public String getErrorPath() {

return this.errorProperties.getPath();

}

@RequestMapping(produces = MediaType.TEXT_HTML_VALUE)

public ModelAndView errorHtml(HttpServletRequest request, HttpServletResponse response) {

HttpStatus status = getStatus(request);

Map model = Collections

.unmodifiableMap(getErrorAttributes(request, isIncludeStackTrace(request, MediaType.TEXT_HTML)));

response.setStatus(status.value());

ModelAndView modelAndView = resolveErrorView(request, response, status, model);

return (modelAndView != null) ? modelAndView : new ModelAndView("error", model);

}

@RequestMapping

public ResponseEntity> error(HttpServletRequest request) {

HttpStatus status = getStatus(request);

if (status == HttpStatus.NO_CONTENT) {

return new ResponseEntity<>(status);

}

Map body = getErrorAttributes(request, isIncludeStackTrace(request, MediaType.ALL));

return new ResponseEntity<>(body, status);

}

....

}

errorProperties类定义如下:

public class ErrorProperties {

/**

* Path of the error controller.

*/

@Value("${error.path:/error}")

private String path = "/error";

...

}

由此可见,springboot中默认有一个处理/error映射的控制器,有error和errorHtml两个方法的存在,它可以处理来自浏览器页面和来自机器客户端(app应用)的请求。

当用户请求不存在的url时,dispatcherServlet会交由ResourceHttpRequestHandler映射处理器来处理该请求,并在handlerRequest方法中,重定向至/error映射,代码如下:

@Override

public void handleRequest(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

// For very general mappings (e.g. "/") we need to check 404 first

Resource resource = getResource(request);

if (resource == null) {

logger.debug("Resource not found");

response.sendError(HttpServletResponse.SC_NOT_FOUND); // 404

return;

}

...

}

getResource(request)会调用this.resolverChain.resolveResource(request, path, getLocations())方法,getLocations()方法返回结果如下:

接着程序会执行到getResource(pathToUse, location)方法如下:

@Nullable

protected Resource getResource(String resourcePath, Resource location) throws IOException {

// 新建一个resource对象,url为 location + resourcePath,判断此对象(文件)是否存在

Resource resource = location.createRelative(resourcePath);

if (resource.isReadable()) {

if (checkResource(resource, location)) {

return resource;

}

else if (logger.isWarnEnabled()) {

Resource[] allowedLocations = getAllowedLocations();

logger.warn("Resource path \"" + resourcePath + "\" was successfully resolved " +

"but resource \"" + resource.getURL() + "\" is neither under the " +

"current location \"" + location.getURL() + "\" nor under any of the " +

"allowed locations " + (allowedLocations != null ? Arrays.asList(allowedLocations) : "[]"));

}

}

return null;

}

在resource.isReadable()中,程序会在locations目录中寻找path目录下文件,由于不存在,返回null。

最终也就导致程序重定向至/error映射,如果是来自浏览器的请求,也就会返回/template/error/404.html页面,所以对于404请求,只需要在template目录下新建error目录,放入404页面即可。

使用注意在springboot4.x中我们可以自定义ControllerAdvice注解 + ExceptionHandler注解来助理不同错误类型的异常,但在springboot中404异常和拦截器异常由spring自己处理。

springboot怎么返回404_springboot异常处理之404相关推荐

  1. springboot怎么返回404_SpringBoot(二十)_404返回统一异常处理结果

    1.修改application.properties文件# 自定义404 #出现错误时, 直接抛出异常 spring.mvc.throw-exception-if-no-handler-found=t ...

  2. springboot怎么返回404_深度分析:SpringBoot异常捕获与封装处理,看完你学会了吗?...

    简介 日常开发过程中,难免有的程序会因为某些原因抛出异常,而这些异常一般都是利用try ,catch的方式处理异常或者throw,throws的方式抛出异常不管.这种方法对于程序员来说处理也比较麻烦, ...

  3. springboot整合之统一异常处理

    特别说明:本次项目整合基于idea进行的,如果使用Eclipse可能操作会略有不同,不过总的来说不影响. springboot整合之如何选择版本及项目搭建 springboot整合之版本号统一管理  ...

  4. springboot 接口返回数据时 net.sf.json.JSONNull[“empty“]) 异常

    springboot 接口返回数据时 net.sf.json.JSONNull["empty"]) 异常 参考文章: (1)springboot 接口返回数据时 net.sf.js ...

  5. springboot aop + logback + 统一异常处理 打印日志

    springboot aop + logback + 统一异常处理 打印日志 参考文章: (1)springboot aop + logback + 统一异常处理 打印日志 (2)https://ww ...

  6. 怎么返回404_seo如果出现404页面怎么办?如何解决?

    seo如果出现404页面怎么办?如何解决?很多人对于404页面都司空见惯了,但是要如何找出404错误呢?如何解决呢?下面聚名网小编就为大家介绍一下404页面对于seo是什么. seo如果出现404页面 ...

  7. SpringBoot开发案例之异常处理并邮件通知

    SpringBoot开发案例之异常处理并邮件通知 参考文章: (1)SpringBoot开发案例之异常处理并邮件通知 (2)https://www.cnblogs.com/lywJ/p/1107696 ...

  8. SpringBoot统一返回处理出现cannot be cast to java.lang.String异常

    SpringBoot统一返回处理出现cannot be cast to java.lang.String异常 一 问题出现背景: 二 解决方案 三 异常原因分析 原因: 源码详细分析: 正常返回: 返 ...

  9. php页面会返回状态200,服务器404错误页面http状态返回值为200的原因解析

    今天在网上找了很多关于404页面的相关资料,目的就是为了吃透关于404的一些知识. 登陆google管理工具后台,发现网站未验证,并提示:我们检测到您的 404(找不到文件)错误页在标头中返回了 20 ...

  10. 关于SpringBoot如何返回视图

    关于SpringBoot 如何返回一个视图页面(例如JSP) 首先需要在配置文件中配置这一段 spring:     mvc:     view:       prefix: /pages/     ...

最新文章

  1. 强化学习笔记:Sarsa算法
  2. 叉积 微分 恒等式_考研真题分章解析 | 第二章 导数与微分
  3. 牛客题霸 [ 最长公共前缀] C++题解/答案
  4. java界面 文件选择器_掌握java技术 必备java工具应用知识
  5. 计算机网络之数据链路层:1、概述
  6. mysql内连接部门平均值_详解MySql基本查询、连接查询、子查询、正则表达查询_MySQL...
  7. 常用控件 winform
  8. 诗与远方:无题(四)
  9. ubuntu18下pyspider的安装
  10. 初级第七课——模拟计算器
  11. apollo重要服务之metaService
  12. Ubuntu源码安装gcc-10
  13. java架构师成长之路学习心得
  14. Webcontent 和WebRoot的区别
  15. v-charts 如何更改文本颜色
  16. java如何使用barcode4j生成条形码_JAVA条形码生成组件barcode4j使用
  17. 关于手机使用中信号强弱 网速快慢 频段的相关常识
  18. 这些各行各业优秀的ppt模板推荐给大家
  19. (三)DDD上下文映射图——老师,我俩可是纯洁的男女关系!
  20. 在持续集成 (CI) 环境中使用 Android 模拟器 | AndroidDevSummit 中文字幕视频

热门文章

  1. 计算机组成原理补充实验,计算机组成原理补充实验.doc
  2. 【元胞自动机】基于matlab元胞自动机模拟交通事故道路通行量【含Matlab源码 356期】
  3. 天津市计算机网络应用大赛,2017年天津市中等职业学校“圣纳·新道杯”技能大赛计算机应用技术技能比赛在我校开赛...
  4. solr获取同义词 java_如何在使用缩写及其全名搜索时使solr同义词获取相同的结果(相同的数字和顺序)...
  5. 机器学习库线性回归代码_PyCaret回归:更好的机器学习库
  6. 微擎不现实数组_Java这个类,大概就和现实中吃饭一样常见
  7. 读取位置时发生访问冲突 c++_王道计算机网络|第三章数据链路层1314介质访问控制...
  8. C/C++ 各种进制的表示方法/ 进制前缀
  9. 二叉树前序遍历、中序遍历、后序遍历 递归和非递归方式实现
  10. nginx限制请求数(ngx_http_limit_req_module)模块