Spring Boot自定义错误视图的方法详解

网友投稿 603 2023-05-02

Spring Boot自定义错误视图的方法详解

Spring Boot缺省错误视图解析器

  Web应用在处理请求的过程中发生错误是非常常见的情况,SpringBoot中为我们实现了一个错误视图解析器(DefaultErrorViewResolver)。它基于一些常见的约定,尝试根据HTTP错误状态码解析出错误处理视图。它会在目录/error下针对提供的HTTP错误状态码搜索模板或者静态资源,比如,给定了HTTP状态码404,它会尝试搜索如下模板或者静态资源:

//error/404. - 这里表示所配置的模板所在目录,表示所用的模板的文件名

//error/404.html- 这里表示静态资源文件所在路径、

//error/4xx.

//error/4xx.html

如果找不到就用默认的白标错误视图,如下图所示:

因此,为了给用户最佳的使用体验,404等常见错误需要我们自定义页面来处理。以下是几种自定义错误页面的方式。

方式1. 定义静态的错误页面

在 resources 下的 static 目录下,新建 error 目录,在其中新建各种静态错误页面,如 404、500,也可以模糊处理,如4xx、5xx 等,当程序运行出错时,会自动根据错误代码(如500)找到相应的错误页面(如/static/error/500.html),给予展示。

方式2. 定义动态的错误页面(有采用模板引擎)

在有使用模板的情况下,SpringBoot缺省的错误视图解析器也会在//error下搜索错误展示视图。我们可以使用项目中的视图模板引擎在错误页面来定制展示我们的错误消息。

1) 在 resources 下的 templates 目录下,新建 error 目录,在其中新建各种静态错误页面,如 404、500,也可以模糊处理,如4xx、5xx等(与方式1一致)+

在模板引擎的支持下可以取到错误的一些信息,并定制化显示在页面上,如下(freemarker模板):

错误信息定制:

timestamp:时间戳

status:状态码

error:错误提示

exception:异常对象

trace:跟踪流程日志,404状态下无

message:异常消息

path:请求路径

方式3. 自定义实现错误视图解析,统一错误处理

如果不想要使用缺省的错误处理视图解析器,想要定制一些自己的东西(比如说:错误引导信息等),按照官方文档的建议我们可以自定义实现错误视图解析接口来处理。

下面就是通过实现错误视图解析接口ErrorViewResolver,将4xx、5xx的错误页面集中在一个自定义视图上:

1)实现 ErrorViewResolver 接口

package com.hongyang.admin.web;

import org.springframework.boot.autoconfigure.web.servlet.error.ErrorViewResolver;

import org.springframework.http.HttpStatus;

import org.springframework.stereotype.Component;

import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;

import java.util.Map;

/**

* 实现自定义的错误视图解析器

*/

@Component

public class AdminErrorViewResolver implements ErrorViewResolver {

/**

* 实现ErrorViewResolver约定方法,

* 返回统一的错误视图.

* @param request

* @param status

* @param model

* @return

*/

@Override

public ModelAndView resolveErrorView(HttpServletRequest request, HttpStatus status, Map model) {

return new ModelAndView("/error/index", model);

}

}

2)完成错误视图,在templates/error下添加index.ftlh视图(freemarker模板)

${error},点击查看明细!

错误说明

<#if path??>

请求的URL:${path}

#if>

<#if message??>

异常信息:${message}

#if>

<#if trace??>

StackTrace:
${trace}

#if>

3)最后效果

错误页面的展示优先级

1、精确大于模糊

2、动态大于静态

总结

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:IDEA 非常重要的一些设置项(一连串的问题差点让我重新用回 Eclipse)
下一篇:2020最新eclipse安装过程及细节
相关文章

 发表评论

暂时没有评论,来抢沙发吧~