一. 问题背景

后台: SpringBoot 2.3.1(官方2.3版本修改了很多,抛弃了很多以前能用的方法)

前端: Layui(前端用哪个框架问题不大)

技术: SpringBoot+Thymeleaf+Layui

情况:我想将Layui提供好的错误页面作为SpringBoot默认的错误页面,而且Layui提供的错误页面位置并不是放在/静态资源文件夹/error,而是在如下:

二. SpringBoot的错误页面机制

首先要知道SpringBoot的错误页面机制原理自动配置是由ErrorMvcAutoConfiguration配置的。所以定制错误页面的解决方案都可以参考ErrorMvcAutoConfiguration类以及参考他人博客。

这里只做简单的回顾,如下:

三. 定制错误页面

首先我项目里面在application.properties配置了静态资源路径为classpath:/templates/layuimini/,如下:

#自定义静态资源路径

spring.resources.static-locations=classpath:/templates/layuimini/

大家根据需要自行调整自己项目里面的静态资源路径,后面的定制错误页面的路径会根据这个配置好的路径去寻找,或者拼串。

3.1 方案一(最简单的,但是不推荐)

3.1.1 步骤

最简单是 在静态资源文件夹下面创建一个error文件夹,在里面放置自己的错误页面,如下:

不推荐的原因是,我当前的目录结构是所有的页面都是放在/templates/layuimini/page/文件夹下面的,如果按照上面做法,会破坏我的目录结构,后期维护很困难。

3.1.2 原理

在BasicErrorController中,封装视图的时候,当前项目如果有模板引擎,会先用模板引擎解析,找不到再去静态资源文件夹寻找视图(视图名是error/状态码.html,这是指error文件夹下的状态码.html文件,这是由私有方法实现的,所以外部无法修改)。因此上面的步骤就是SpringBoot先去templates文件夹下找,找不到,再去/templates/layuimini/这个静态资源文件夹找(前提是你设置了静态资源文件夹;否则默认按SpringBoot的默认静态资源文件夹找,比如resources、public、static、resource)

3.2 方案二(不能实现自适应定制错误页面,不推荐)

3.2.1 步骤

首先放置好自定义的错误页面,是在/templates/layuimini/page/error/,如下:

然后再创建一个MyErrorPageConfig类,最最最关键的是new ErrorPage()中第二个入参,如果是加了.html,那么就会直接找页面,如果没有加,那么将它当作请求去找controller,如下:

@Configuration

public class MyErrorPageConfig {

@Bean

public WebServerFactoryCustomizer webServerFactoryCustomizer(){

return new WebServerFactoryCustomizer() {

@Override

public void customize(ConfigurableWebServerFactory factory) {

ErrorPage errorPage1 = new ErrorPage(HttpStatus.NOT_FOUND, "/page/error/4xx.html");

ErrorPage errorPage2 = new ErrorPage(HttpStatus.NOT_FOUND, "/page/error/5xx.html");

factory.addErrorPages(errorPage1, errorPage2);

}

};

}

}

3.2.2 原理

首先要知道SpringBoot2.x版本的嵌入式Servlet容器是由ServletWebServerFactoryAutoConfiguration类配置的。一切的配置信息以及解决方案都可以参考这个类。

这里只做简单解释,如下:

这样它就会执行上面步骤中的customize()方法中的方法

3.3 方案三(实现自适应)

自适应就是根据发送的/error请求是浏览器还是客户端,使用不同的controller方法进行处理,并返回不同类型的数据

3.3.1 步骤

创建一个实现了ErrorController接口的MyBasicErrorController类,如下:

/**

* 定制ErrorController,目的是能使SpringBoot找到自己定制的错误页面

* 大部分的代码BasicController一致,关键点是修改错误页面的路径

*/

@Controller

@RequestMapping(value = "/error")

public class MyBasicErrorController implements ErrorController {

@RequestMapping(produces = {"text/html"})//返回给浏览器

public String handlerError(HttpServletRequest request, Model model){

WebRequest webRequest = new ServletWebRequest(request);//对request进行包装,目的是能操作更多的方法

HttpStatus status = this.getStatus(request);//获取status

String path = (String) webRequest.getAttribute("javax.servlet.error.request_uri", 0);

String message = (String) webRequest.getAttribute("javax.servlet.error.message", 0);

if(message.equals("")){

message = "No Available Message";

}

//携带错误数据信息

model.addAttribute("timestamp", new Date());

model.addAttribute("statusCode", status.value());

model.addAttribute("error", status.getReasonPhrase());

model.addAttribute("message", message);

model.addAttribute("path", path);

int i = status.value() / 100;//判断是4xx还是5xx错误

if(i == 4){

return "layuimini/page/error/4xx";//使用自己定制的错误页面

}else if(i == 5){

return "layuimini/page/error/5xx";//使用自己定制的错误页面

}

return null;

}

@RequestMapping//返回给客户端

public ResponseEntity> error(HttpServletRequest request) {

WebRequest webRequest = new ServletWebRequest(request);//对request进行包装,目的是能操作更多的方法

HttpStatus status = this.getStatus(request);//获取status

Map map = new HashMap<>();

if (status == HttpStatus.NO_CONTENT) {

return new ResponseEntity(status);

} else {

String path = (String) webRequest.getAttribute("javax.servlet.error.request_uri", 0);

String message = (String) webRequest.getAttribute("javax.servlet.error.message", 0);

map.put("timestamp", new Date());

map.put("statusCode", status.value());

map.put("error", status.getReasonPhrase());

map.put("message", message);

map.put("path", path);

return new ResponseEntity(map, status);

}

}

protected HttpStatus getStatus(HttpServletRequest request) {

Integer statusCode = (Integer)request.getAttribute("javax.servlet.error.status_code");

if (statusCode == null) {

return HttpStatus.INTERNAL_SERVER_ERROR;

} else {

try {

return HttpStatus.valueOf(statusCode);

} catch (Exception var4) {

return HttpStatus.INTERNAL_SERVER_ERROR;

}

}

}

@Override

public String getErrorPath() {

return "null";

}

}

3.3.2 原理

SpringBoot的错误页面机制的自适应,是由BasicErrorController实现的,而这个BasicErrorController只有在容器中没有ErrorController的情况下,才会被注册进容器,因此我们创建一个实现了ErrorController接口的类,这个BasicErrorController就失效,然后我们仿照BasicErrorController里面的方法来实现自己的controller就可以了。如下:

@Bean

@ConditionalOnMissingBean(

value = {ErrorController.class},//没有ErrorController才会去注册BasicErrorController

search = SearchStrategy.CURRENT

)

public BasicErrorController basicErrorController(ErrorAttributes errorAttributes, ObjectProvider errorViewResolvers) {

return new BasicErrorController(errorAttributes, this.serverProperties.getError(), (List)errorViewResolvers.orderedStream().collect(Collectors.toList()));

}

上面实现步骤中的一些错误数据是参照DefaultErrorAttributes中的方法实现的

到此这篇关于SpringBoot2.3定制错误页面的方法示例的文章就介绍到这了,更多相关SpringBoot2.3定制错误页面内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

Java前端自定义错误信息封装_SpringBoot2.3定制错误页面的方法示例相关推荐

  1. 导入数据任务(id:373985)异常, 错误信息:解析导入文件错误,请检查导入文件内容,仅支持导入json格式数据及excel文件

    导入数据任务(id:373985)异常, 错误信息:解析导入文件错误,请检查导入文件内容,仅支持导入json格式数据及excel文件 参考文章: (1)导入数据任务(id:373985)异常, 错误信 ...

  2. 项目上线,php的错误信息必须不让其在页面中显示给客户,

    对于PHP开发者来 说,一旦某个产品投入使用,应该立即将 display_errors选项关闭,以免因为这些错误所透露的路径.数据库连接.数据表等信息而遭到黑客攻击.但是,任何一个产品在投入使用后,都 ...

  3. 导入数据任务(id:373985)异常, 错误信息:解析导入文件错误,请检查导入文件内容,仅支持导入json格式数据及excel文件...

    小程序导入,别人导出的数据库json文件,错误信息如下: 导入数据库失败, Error: Poll error, 导入数据任务(id:373985)异常,错误信息:解析导入文件错误,请检查导入文件内容 ...

  4. php链接mysql 老是die_php连接MySQL时, 为什么die(错误信息: . $conn-connect_error) 不返回错误信息?...

    php连接MySQL时,遇到个问题搞不懂了.代码(如下图):<?php $servername="localhost";$username="root"; ...

  5. Java swing 自定义窗口最大、最小和关闭的极简方法

    Java swing 自定义窗口最大.最小和关闭的极简方法, 直接代码伺候: package com.yufu.test; import java.awt.EventQueue; import jav ...

  6. java 404页面_SpringBoot全局异常处理与定制404页面的方法

    一.错误处理原理分析 使用SpringBoot创建的web项目中,当我们请求的页面不存在(http状态码为404),或者器发生异常(http状态码一般为500)时,SpringBoot就会给我们返回错 ...

  7. txt doc rtf html,JAVA读取WORD,EXCEL,PDF,TXT,RTF,HTML文件文本内容的方法示例.docx

    JAVA读取WORD,EXCEL,PDF,TXT,RTF,HTML文件文本内容的方法示例 JAVA读取WORD,EXCEL,PDF,TXT,RTF,HTML文件文本内容的方法示例??2012-06-2 ...

  8. java异常自定义返回信息,Spring Boot 如何自定义返回错误码错误信息

    说明 在实际的开发过程中,很多时候要定义符合自己业务的错误码和错误信息,而不是统一的而不是统一的下面这种格式返回到调用端 INTERNAL_SERVER_ERROR(500, "Intern ...

  9. 修改html文件500错误信息,打开网页提示 HTTP500错误的终极解决方法

    http 500内部服务器错误说明IIS服务器无法解析ASP代码,访问一个静态页面试试是否也出现这个问题,如果访问静态页面没问题,那就要分以下几种 情况来分析了: ① 你是否改变过计算机名称. ② 站 ...

  10. 401错误信息页html,Http 401错误重现实验及解决办法

    根据http协议对状态码的定义,401表明未经受权的访问.在IIS中在401的基础上定义了一系列的子状态码来表明各类不一样状况下未经受权访问的具体缘由. html 401.1 - Logon fail ...

最新文章

  1. C#的反射机制调用方法
  2. 捷易拍sdk开发指南.doc_每个Android开发都必须知道的利器
  3. 知乎:什么时候你是产品经理,而不是产品助理?
  4. std::string 收缩到合适大小_如何选择合适的自动伸缩门尺寸-深圳自动伸缩门供应商...
  5. Shell练习题(持续更新)
  6. 按一行一行的方法将一个文本文件复制到另一个文件中_命令行技巧:分割文件内容...
  7. PowerEdge服务器生命周期控制器:Lifecycle Controller
  8. Windows 之间用rsync同步数据(cwRsyncServer配置)
  9. vue 自定义组件的自定义属性
  10. 兄弟打印机内存已满清零方法_兄弟打印机打印时显示内存已满怎么办
  11. Paypal付款按钮变量列表
  12. Java程序员月薪20k的涨薪秘籍,系列教学
  13. 322. Coin Change
  14. 【附源码】Java计算机毕业设计安卓和悦少年文明礼仪监管APP(程序+LW+部署)
  15. netkeeper客户端_星空极速下载-NetKeeper官方版下载[电脑版]-华军软件园
  16. linux 启动wifi
  17. 用故事讲清楚统计学的Confidence Interval(置信区间)and Hypothesis Test
  18. 小程序开发系列之基础部分-代码结构
  19. cscope 相关笔记
  20. USB接口以太网芯片SR9900

热门文章

  1. 创建应答文件——无人值守安装XP/2003
  2. MVC3 Razor语法
  3. 尽量用iterator代替const_iterator
  4. Elastic Search 查询语法大全
  5. sourceTree把当前分支合并到远程分支
  6. 把word excel ppt 导入到右键快捷菜单中
  7. 【晒出你的第83行代码】跬步千里,十二年的老代码更是技术的沉淀!
  8. 英文单词 modal 模态,flex里取模糊之意
  9. android.mk ifeq使用介绍,Makefile中的ifeq 多条件使用
  10. Linux下安装Win10ARM,更多安卓旗舰机将可以安装运行Win10 ARM