在SpringBoot中发生了4xx 5xx之类的错误,SpringBoot默认会发一个/error的请求,该请求由BasicErrorController处理,即在SpringBoot中错误处理也是由Controller负责的。该Controller种主要有两个方法,分别用来返回HTML页面和JSon数据,具体返回何种数据由请求的头信息来确定。

    @RequestMapping(produces = MediaType.TEXT_HTML_VALUE)
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) ? modelAndView : new ModelAndView("error", model);
} @RequestMapping
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<>(body, status);
}

  在返回HTML的方法中,需要返回一个ModelAndView对象,该对象由resolveErrorView方法生成。resolveErrorView方法调用DefaultErrorViewResolver方法生成ModelAndView对象。具体的顺序是

  • 如果模板引擎可用则在template目录下error下根据错误的代码4xx 5xx寻找对应的页面
  • 如果模板引擎不可用则去static目录下error下根据错误代码寻找页面
  • 如果都没有就返回默认的页面

简单的自定义过程

  直接把错误页面放在static/error下,页面是静态的,不能从渲染从后端取来的数据

  错误页面放在templates/error下,可使用模板语言取出数据

完整的自定义过程

  一个完整的错误页面定制应该符合以下标准

  • 可以根据请求的不同返回json数据或者ModelAndView对象即html页面
  • 能够把后端的数据携带到页面上
  • 能够处理自定义异常

  首先自定义异常,随便定义的异常,继承RuntimeException。

package com.xwk.exception;

public class UserNotExistException extends RuntimeException {
public UserNotExistException() {
super("用户不存在");
}
}

  编写Controller抛出异常

    @RequestMapping("hello")
@ResponseBody
public String hello(){ if (true) {
throw new UserNotExistException();
}
return "hello world";
}

  实现自定义异常处理应该分为两步

  • 能够根据异常的类型做出不同的处理,即根据异常的类型返回不同的数据
  • 能够把返回的数据渲染出来

  

根据类型捕获异常

  前面提到SpringBoot在异常发生的时候会发一个请求,需要一个Controller来像处理正常请求一样处理异常,在SpringBoot中异常处理的思路跟请求处理的思路是一样的。这里使用ControllerAdvice,并使用@ExceptionHandler注解表明该方法处理异常的类型,ExceptionHandler的作用和RequestMapping一样,SpringBoot会根据异常的类型找到处理该异常的方法。在handleUserNotFoundException方法上标注ExceptionHandler(UserNotExistException.class)后,所有抛出UserNotExistException的请求都会来到handleUserNotFoundException方法,这样我们的第一步已经完成的一半。

  之所以说只完成的一半是因为这些数据还没有传给视图解析对象,传递的方法是通过reqiest域,把存放需要在前端显示的数据的map放在request域中,并设置该错误的状态码。

@ControllerAdvice
public class MyExceptionHandler {
@ExceptionHandler(UserNotExistException.class)
private String handleUserNotFoundException(Exception e, HttpServletRequest request){
HashMap<String, Object> hashMap = new HashMap<>();
hashMap.put("message","hghah");
hashMap.put("status","500");
request.setAttribute("ext",hashMap);
request.setAttribute("javax.servlet.error.status_code",500); return "forward:/error";
}
}

解析自定义异常数据   

  这部分代码可以看做是固定的,无论定义何种异常都要把下面这段代码加进去。

public class ErrorAttributes extends DefaultErrorAttributes {
@Override
public Map<String, Object> getErrorAttributes(WebRequest webRequest, boolean includeStackTrace) {
Map<String, Object> map = super.getErrorAttributes(webRequest,includeStackTrace);
Map<String, Object> ext = (Map<String, Object>)webRequest.getAttribute("ext", 0);
map.put("ext",ext); return map;
}
}

SpirngBoot--错误消息的定制的更多相关文章

  1. Struts(十九):类型转换、类型转换错误消息及显示

    类型转换概念 1.从html表单页面到一个Action对象,类型转化是从字符串到一个非字符串:html并没有“类型”的概念,每个表单输入的信息都只可能是一个字符串或者一个字符串数组,但是在服务器端,必 ...

  2. 允许asp.net MVC报 错说明: 访问服务此请求所需的资源时出错。服务器可能未配置为访问所请求的 URL。错误消息 401.2。: 未经授权

    运行mvc3程序报以下错误 详细报错如下: “/”应用程序中的服务器错误. 访问被拒绝. 说明: 访问服务此请求所需的资源时出错.服务器可能未配置为访问所请求的 URL. 错误消息 401.2.: 未 ...

  3. "错误消息 401.2。: 未经授权: 服务器配置导致登录失败。"的解决办法

    [详细报错如下]: “/”应用程序中的服务器错误. 访问被拒绝. 说明: 访问服务此请求所需的资源时出错.服务器可能未配置为访问所请求的 URL. 错误消息 401.2.: 未经授权: 服务器配置导致 ...

  4. 数据连接到 Web 服务 InfoPath 2010 窗体中的 SharePoint 服务器上运行时的错误消息:"401-未经授权"解决方案

    症状: 请考虑以下情形: Web 窗体发布到 SharePoint 服务器. 您创建 Microsoft InfoPath 2010 表单所在的 SharePoint 服务器上使用到位于数据的数据连接 ...

  5. knockout-validation不自动插入错误消息

    <div data-bind="validationOptions:{insertMessages:false}"> <div class="valid ...

  6. IE调试网页之四:F12 开发人员工具控制台错误消息 (Windows)(转载)

    F12 工具控制台可以报告在运行时期间发生的错误和信息消息.本文将介绍错误消息,并提供有关如何修正这些错误的建议. 简介 F12 工具控制台错误消息提供了一些代码(例如,SEC7111 或 HTML1 ...

  7. SpringMVC——类型转换和格式化、数据校验、客户端显示错误消息

    在介绍类型转换和格式化之前,我首先来介绍 <mvc:annotation-driven />. 需要导入的 schema: xmlns:mvc="http://www.sprin ...

  8. 在SQL2008R2查询分析器出错(在执行批处理时出现错误。错误消息为: 目录名称无效。)

    在用SQL2008R2查询分析器时 SELECT * FROM 表名; 出错: 在执行批处理时出现错误.错误消息为: 目录名称无效. 原因: 在打开查询分析器时,用360软件清空了临时文件(只是偶尔1 ...

  9. IIS7部署项目时提示:"错误消息 401.2。: 未经授权: 服务器配置导致登录失败。"的解决办法

    这个错误的定位:你的站点使用了Forms验证,而且在部署在生产环境的时候,设置错误,或者注释了. 解决方法如下: 1.检查Forms配置是否屏蔽. 2.有权限访问的资源是否已经开发. 基本就围绕以上两 ...

  10. 分析器错误消息: 类型“test.test.testx”不明确: 它可能来自程序集“F:\testProject\bin\test.test.DLL”或程序集“F:\testProject\bin \testProject.DLL”。请在类型名称中显式指定程序集。

    问题描述: RT 分析器错误消息: 类型“test.test.testx”不明确: 它可能来自程序集“F:\testProject\bin\test.test.DLL”或程序集“F:\testProj ...

随机推荐

  1. 洛谷P4408 逃学的小孩

    题目 求树的直径,因为任意两个居住点之间有且只有一条通路,所以这是一棵树. 根据题意父母先从C去A,再去B,或者反过来. 我们一定是要让A到B最大,也要让C到A和B的最小值最大. AB最大一定就是直径 ...

  2. Java运算符和类型转换

    以下代码输出结果是: public class Test { public static void main(String[] args) { int a = 5; System.out.printl ...

  3. Kubernetes集群部署(yum部署)

    环境准备 Kubernetes-Master:192.168.37.134    #yum install kubernetes-master etcd flannel -y Kubernetes-n ...

  4. 计算电脑所能表示的最大最小值(c++)

    C++当中获得现在计算机上所能表示的各种类型(比如int,long int,short int,double,float等)最大最小有两种方法,一种是使用c++预先定义的宏,对于有些编译器可能需要包含 ...

  5. Ecms7.5版CK编辑器保留word格式如何修改

    7.5版的编辑器默认会清除多余的word代码,如果要保留word格式怎么修改? CKeditor编辑器默认复制会清除多余word代码,如果要保留word格式可以按下面修改配置: 修改 /e/admin ...

  6. 生成Nginx服务器SSL证书和客户端证书

    Nginx服务器SSL证书 生成pass key 下面的命令用于生成一个2048bit的pass key, -passout pass:111111 用于避免交互式输入密码 [tomcat@a02 t ...

  7. 文件分片 浏览器文件大小限制 自定义请求头 在一个资源的加载进度停止之后被触发 arrayBuffer 异步 二进制数据缓存区

    js 整数限制 浏览器文件大小限制 https://w3c.github.io/FileAPI/#dom-blob-arraybuffer https://developer.mozilla.org/ ...

  8. [LeetCode] 675. Cut Off Trees for Golf Event 为高尔夫赛事砍树

    You are asked to cut off trees in a forest for a golf event. The forest is represented as a non-nega ...

  9. Node.js 多线程完全指南

    [原文] 很多人都想知道单线程的 Node.js 怎么能与多线程后端竞争.考虑到其所谓的单线程特性,许多大公司选择 Node 作为其后端似乎违反直觉.要想知道原因,必须理解其单线程的真正含义. Jav ...

  10. LeetCode:复原IP地址【93】

    LeetCode:复原IP地址[93] 题目描述 给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式. 示例: 输入: "25525511135" 输出: [&qu ...