Spring Boot自定义错误页面,Whitelabel Error Page处理方式_spring mvc 修改whitelabel error page-程序员宅基地

技术标签: spring  

我已经是Spring Framework框架的忠实粉丝。对于企业软件开发者来说它提供了对常见问题的通用解决方案,包括那些你在未来开发中没有意识到的问题。但是,它构建的J2EE项目变得比较臃肿,需要被一种新的解决方案替代。

我最大的抱怨就是最开始使用spring Framework构建项目十分缓慢和复杂,比如构建一个包含JPA的MVC应用。为改变这种情况,Spring Boot应运而生了。

Spring Boot以一种新的微服务的方式来替代以Spring Framework构建项目的传统方式,我已经计划在后续的项目开发中使用它。它已经帮我们做了90%的工作,剩下10%的工作需要我们自己去完成。对于我来说,自定义错误页面就是其中之一。比如404错误,如果不处理的话,会出现“This application has no explicit mapping for /error, so you are seeing this as a fallback.”的错误信息,如图所示:

Whitelabel Error Page

Spring Boot默认使用嵌入式Tomcat,默认没有页面来处理404等常见错误。因此,为了给用户最佳的使用体验,404等常见错误需要我们自定义页面来处理。

我们需要用org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizer类来实现该功能,在Spring Boot的启动类(main方法所在类)当中,添加如下代码:

@Bean
public EmbeddedServletContainerCustomizer containerCustomizer() {

   return (container -> {
        ErrorPage error401Page = new ErrorPage(HttpStatus.UNAUTHORIZED, "/401.html");
        ErrorPage error404Page = new ErrorPage(HttpStatus.NOT_FOUND, "/404.html");
        ErrorPage error500Page = new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR, "/500.html");

        container.addErrorPages(error401Page, error404Page, error500Page);
   });
}
   
   
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

这是使用Java 8的lambda表达式来简化实现的方式,在代码中创建了三个ErrorPage实例来处理三个通用的HTTP错误状态码,并将他们添加到Container当中。ErrorPage类是一个封装了错误信息的类,它可以在Jetty和Tomcat环境下使用。

这是使用Java 7内部类的一个等价实现方式:

@Bean
public EmbeddedServletContainerCustomizer containerCustomizer() {

    return new EmbeddedServletContainerCustomizer() {
        @Override
        public void customize(ConfigurableEmbeddedServletContainer container) {

            ErrorPage error401Page = new ErrorPage(HttpStatus.UNAUTHORIZED, "/401.html");
            ErrorPage error404Page = new ErrorPage(HttpStatus.NOT_FOUND, "/404.html");
            ErrorPage error500Page = new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR, "/500.html");

            container.addErrorPages(error401Page, error404Page, error500Page);
        }
    };
}
   
   
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

错误页面需要放在Spring Boot web应用的static内容目录下,它的默认位置是:src/main/resources/static,如下图所示:

这里写图片描述

点击链接下载图中的三个文件的压缩文件,这些文件使用 HTML5 Boilerplate制作。

现在,就可以看到一个简易版本的错误页面,可以根据自己的需要对它进行一些美化。

编译自:http://www.sporcic.org/2014/05/custom-error-pages-with-spring-boot/

(function () { ('pre.prettyprint code').each(function () { var lines = (this).text().split(\n).length;var numbering = (<ul></ul>).addClass(prenumbering).hide(); (this).addClass('has-numbering').parent().append( numbering);for(i=1;i<=lines;i++)$numbering.append($(<li></li>).text(i));; numbering.fadeIn(1700); }); });
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zmken497300/article/details/53434574

智能推荐

腾讯云centos安装jdk+tomcat+mysql_腾讯源搭建centos tomcat-程序员宅基地

文章浏览阅读218次。一、安装jdk参考:腾讯云Centos安装jdk8 - 河岸飞流 - 博客园wget下载jdk1.8_weixin_33785972的博客-程序员宅基地1.先切换目录cd /usr/local/src #切换到该目录下2.wget下载jdk压缩包wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept_腾讯源搭建centos tomcat

《授予博士、硕士学位和培养研究生的学科、专业目录》 (1997 颁布 )-程序员宅基地

文章浏览阅读197次。  一、《授予博士、硕士学位和培养研究生的学科、专业目录》(简称“学科、专业目录”),是国务院学位委员会学科评议组审核授予学位的学科、专业范围划分的依据。同时,学位授予单位按本目录中各学科、专业所归属的学科门类,授予相应的学位。培养研究生的高等学校和科研机构以及各有关主管部门,可以参照本目录制订培养研究生的规划,进行招生和培养工作。  二、 1990 年 10 月,国务院学位委员会和国家教育委..._授予博士硕士学位和培养研究生

JS取出两个数组中相同的元素_js查找两个不同长度的数组中相同的元素-程序员宅基地

文章浏览阅读9.4k次,点赞2次,收藏18次。实现目的商品搜索,需要满足名字搜索和id搜索。名字搜索,是直接走接口数据。但是id搜索完,需要展示对应的商品。所以需要将id做个比较,确保输入的id 是有商品的.毕竟不能百分之百手动输入正确,所以程序需要做处理找出相同的元素let arr1 = [1, 2, 5];let arr2 = [1, 3, 4, 2];function compare(arr1, arr2) { return arr1.filter((v) => { return arr2.includes(v);_js查找两个不同长度的数组中相同的元素

JMH使用指南_jmh 使用-程序员宅基地

文章浏览阅读6.7k次,点赞4次,收藏19次。关于JMH,可以直接查看官网地址http://openjdk.java.net/projects/code-tools/jmh/本博客内容来自我正在撰写的新书《Java性能优化(暂定名)》,也欢迎购买经典书《Spring Boot 2 实战权威指南》1.3 JMH1.3.1 使用JMH通过手工编写一个性能压测程序有较多的问题不同需要性能比较方法放到一个虚拟机里调用,有可能会互相..._jmh 使用

数据结构 4. 队列_# 如果head节点的右边不为none # 说明队列中已经有元素了 # 就执行下列的操作-程序员宅基地

文章浏览阅读244次。Leetcode部分队列相关练习一、队列1.队列的定义2.队列的实现2.1 用数组实现一个顺序队列2.2 用链表实现一个链式队列2.3 实现一个循环队列练习641. Design Circular Deque(设计一个双端队列)239. 滑动窗口最大值一、队列1.队列的定义队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,..._# 如果head节点的右边不为none # 说明队列中已经有元素了 # 就执行下列的操作

5个酷毙的Python工具-程序员宅基地

文章浏览阅读6.5k次,点赞3次,收藏21次。工欲善其事必先利其器,一个好的工具能让起到事半功倍的效果,Python社区提供了足够多的优秀工具来帮助开发者更方便的实现某些想法,下面这几个工具给我的工作也带来了很多便利,推荐给追求美好事物的你。Python TutorPython Tutor 是由 Philip Guo 开发的一个免费教育工具,可帮助学生攻克编程学习中的基础障碍,理解每一行源代码在程序执行时在计算机中的过程。通过这个工具,教师或_0_10_python代码阅读工具

随便推点

C++中 map 的基本操作和嵌套map的使用_c++ map中可以嵌套map吗-程序员宅基地

文章浏览阅读1.3w次,点赞6次,收藏17次。C++中map容器提供一个键值对容器,map与multimap差别仅仅在于multiple允许一个键对应多个值。本文主要总结一下map基本用法和嵌套用法示例。一、map基本用法 1 头文件 #include &lt;map&gt; 2 定义 map&lt;int, int&gt; my_Map; //注意这里的int和int可以是其他类型 或者是typedef ..._c++ map中可以嵌套map吗

Unity_AR_Vuforia实现点击模型切换一个物体功能-程序员宅基地

文章浏览阅读3.7k次,点赞4次,收藏42次。关键代码如下:using UnityEngine;using System.Collections;public class EarthTouchA : MonoBehaviour { public GameObject EarthFrame; //储存地球仪配件 public GameObject SolarSystem; //储存太阳系模块 public int Set...

SSL/TLS协议安全系列:SSL/TLS概述_ssl2.0什么时候出的-程序员宅基地

文章浏览阅读1.9k次。GoSSIP_SJTU · 2015/05/08 10:39一 前言SSL/TLS协议是网络安全通信的重要基石,本系列将简单介绍SSL/TLS协议,主要关注SSL/TLS协议的安全性,特别是SSL规范的正确实现。 本系列的文章大体分为3个部分:SSL/TLS协议的基本流程典型的针对SSL/TLS协议的攻击SSL/TLS协议_ssl2.0什么时候出的

Chapter 2. URLs and Resources 2.4 Shady Characters-程序员宅基地

文章浏览阅读78次。Chapter 2. URLs and Resources 2.4 Shady Characters URLs were designed to be portable. They were also designed to uniformly name all t..._shady character

Centos7安装WebRTC网关Janus_centos janus 安装-程序员宅基地

文章浏览阅读889次。1.Janus简介Janus 是由Meetecho设计和开发的开源、通用的基于SFU架构的WebRTC流媒体服务器,它支持在Linux的服务器或MacOS上的机器进行编译和安装。由于Janus 是使用C语言进行编写的,因此它的性能十分优秀。Janus 的整体架构图如下图所示。Janus 主要由三个部分组成,分别是Core、Plugin和Transport,下面是相关模块的介绍:Core: Janus的核心部分,其作用是处理数据流的转发,以及各种协议的接入,是WebRTC技术的具体实现。 P_centos janus 安装

freeRTOS-程序员宅基地

文章浏览阅读181次。打印系统任务的一些信息//打印系统运行的任务信息void pritf_sysState(void){ UINT32 TotalRunTime; UBaseType_t ArraySize,x; TaskStatus_t *StatusArray; KEY_DEBUG(" "); KEY_DEBUG("/**************************pritf_sysState***************************/"); ArraySize = uxTaskGet

推荐文章

热门文章

相关标签