• SpringBoot定制错误页面
  1. SpringBoot默认是将所有的错误请求转向/error,在类BasicErrorController可以看到
@Controller
@RequestMapping("${server.error.path:${error.path:/error}}")
public class BasicErrorController extends AbstractErrorController {

private final ErrorProperties errorProperties;
  1. 错误页面存放位置
html静态页面:在resources/public/error/ 下定义
如添加404页面: resources/public/error/404.html页面,中文注意页面编码
模板引擎页面:在templates/error/下定义
如添加5xx页面: templates/error/5xx.ftl templates/error/5xx.html
注:templates/error/ 这个的优先级比较 resources/public/error/高
  • 以下演示:
  • 新建SpringBoot项目添加web和thymeleaf组件
  • 新建HelloController类
//直接抛出异常,那么浏览器是便会访问错误页面
  @RequestMapping("/say6")
  public String error(Model model){
  throw new RuntimeException();
  }
  • 启动容器,访问/say6,此时后台报错且浏览器跳转到SpringBoot的默认错误页面,打印相关信息
  • 新建resources/public/error/404.html 4xx.html 5xx.html
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8"/>
  <title>Title</title>
</head>
<body>
55555555555   5xx.html
</body>
</html>
  • 启动容器,此时访问的是我们放在error目录下的错误页面。
  • 可以在错误页面中打印如下错误信息:
timestamp:时间戳

status:状态码

error:错误提示

exception:异常对象

message:异常消息

errors:JSR303数据校验的错误都在这里
  • 修改后的5xx.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
  <meta charset="UTF-8"/>
  <title>Title</title>
</head>
<body>
<span th:text="'錯誤信息碼='+${status}"></span>
<span th:text="'錯誤信息='+${error}"></span>
<span th:text="'異常信息='+${exception}"></span>
<span th:text="'錯誤信息提示='+${message}"></span>
</body>
</html>
  • SpringBoot定制错误数据
    步骤1:自定义的Exception类继承自RumtimeException或者其他Exception类
public class MyException extends RuntimeException {
  private static final long serialVersionUID = 1L;
  private String message;
  private String str;
  public MyException(String message,String str){
      super("自定义异常");
      this.message=message;
      this.str=str;
  }
  public String getMessage() {
      return message;
  }
  public void setMessage(String message) {
      this.message = message;
  }
  public String getStr() {
      return str;
  }
  public void setStr(String str) {
      this.str = str;
  }
}

此处的message属性会自动的

步骤2:创建ExceptionHangder类处理controller类抛出的异常

@ControllerAdvice //表示這個類是用於處理其他controller類拋出的異常
public class MyExceptionHandler {

@ExceptionHandler(MyException.class)
  public String handleException(Exception e, HttpServletRequest request){

      Map<String,Object> map = new HashMap<>();
      //传入我们自己的错误状态码  4xx 5xx
      //Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code");
      //设置成自己的状态码
      request.setAttribute("javax.servlet.error.status_code",500);
      map.put("handleException-message","handleException-message中存放的信息");

      request.setAttribute("myMessageMap",map);
      //转发到 /error由我们的BasicError 来处理返回JSON还是页面..
      return "forward:/error";
  }
}

步骤3:创建errorAttributes类将自定义的数据设置为可以在前端获取的

@Component
public class MyErrorAttributes extends DefaultErrorAttributes {

 @Override
  public Map<String, Object> getErrorAttributes(RequestAttributes requestAttributes, boolean includeStackTrace) {
      Map<String, Object> map = super.getErrorAttributes(requestAttributes, includeStackTrace);
      map.put("getErrorAttributes-message", "getErrorAttributes-message中存放的信息");
      //我们的异常处理器携带的数据 requestAttributes为请求域中取数据
      Map<String,Object> myMessageMap = (Map<String, Object>) requestAttributes.getAttribute("myMessageMap", 0);
      map.put("myMessageMap",myMessageMap);
      return map;
  }
}

步骤四:编写错误页面

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
  <meta charset="UTF-8"/>
  <title>Title</title>
</head>
<body>
<span th:text="'错误编码='+${status}"></span><br/>
<span th:text="'错误信息='+${error}"></span><br/>
<span th:text="'异常信息='+${exception}"></span><br/>
<span th:text="'message1错误信息提示='+${message1}"></span><br/>
<span th:text="'message2错误信息提示='+${message2}"></span><br/>
<span th:text="'xxx错误信息提示='+${xxx}"></span><br/>
<span th:text="'错误信息提示='+${company}"></span><br/>
<span th:text="'错误信息提示='+${message}"></span><br/>
</body>
</html>

步骤5:访问请求

@RequestMapping("/say6")
  public String error(Model model){
     throw new MyException("myteeeee","ddddddddd");
  }

此处 throw new MyException(“myteeeee”,”ddddddddd”);其中的message属性被自动的返回到页面中去,即可用${message}获取

MyExceptionHandler类中new了一个Map,在MyErrorAttributes通过requestAttributes.getAttribute
(“myMessageMap”, 0);获取到该Map;

所有在前端可以获取到的参数值都是从   
Map<String, Object> map =super.getErrorAttributes(requestAttributes, includeStackTrace); 
的Map中获取到的。