如何定制错误页面?
1.在有模板引擎的前提下(一般都有Thymeleaf),会访问error/状态码.html界面。
我们只需要在模板下,即templates文件夹下建立一个error文件夹,建立一个HTML,名称为4xx,5xx,或者具体的400.html,404.html界面。之所以可以用4xx这样的模糊名称,因为spring boot里面对于无法找到精确的名称就会寻找模糊的。注意,这里优先精确页面。
页面可以拿到的信息(仅限在模板里使用)
使用样例:
<h1>staus:[[${status}]]</h1>
<h2>timestamp:[[${timestamp}]]</h2>
,在有模板的情况下使用还是十分的简单的!
2.在没有模板的情况下,会去静态资源文件夹下寻找。即在resource文件夹的static文件夹下寻找error文件夹,不过在这里由于没有模板引擎,就拿不到上面说的那些信息了。
3.没有静态资源下的相应error文件夹,也没有模板引擎的情况下,就会返回spring boot默认错误界面。
注意:用第一条就好啦。。
定制错误信息
使用系统自带的错误信息,也就是上面罗列的那几个,有时候是不够用的。
这个时候可以使用定制的错误信息,可以再界面上显示自己定制的错误信息,更加灵活。
具体做法:
1.开一个包exception:
idea中对于自定义异常的类的标志是一个闪电哈。
内容为:
package com.jiangyi.springboot.exception;
public class UserNotExistException extends RuntimeException {
public UserNotExistException() {
super("用户不存在!");
}
}
继承运行时的异常。
2.在controller层里面写异常处理类:
这里要可以适应各种客户端,对于pc端,就显示html/text形式的错误界面。
对于手机等等,就显示json数据。
所以,写法:
package com.jiangyi.springboot.controller;
import com.jiangyi.springboot.exception.UserNotExistException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;
@ControllerAdvice
public class MyExceptionHandler {
//这样写不能自适应界面
// @ResponseBody
// @ExceptionHandler(UserNotExistException.class)
// public Map<String, Object> handlerException(Exception e){
// Map<String,Object> map=new HashMap<>();
// map.put("code","user.notexist");
// map.put("message",e.getMessage());
// return map;
// }
/**
* 可以自适应界面
* @param e
* @param request
* @return
*/
@ExceptionHandler(UserNotExistException.class)
public String handlerException(Exception e, HttpServletRequest request) {
Map<String, Object> map = new HashMap<>();
request.setAttribute("javax.servlet.error.status_code",500);
map.put("code", "user.notexist");
map.put("message", e.getMessage());
request.setAttribute("ext",map);
return "forward:/error";
}
}
注意:那里一定需要一个request.setAttribute("javax.servlet.error.status_code",500);
这是必须的。map里面写上定制的数据。再将数据
放在request域中给等下要写的DefaultAttributes用。
3.在component中写一个:MyErrorAttributes继承自DefaultErrorAttributes,这是spring boot中默认错误信息的类。选择重写getErrorAttributes()方法。(可以使用ctrl+o来选择重写方法)
内容:
//给容器中添加我们自己的错误信息
@Component
public class MyErrorAttributes extends DefaultErrorAttributes {
//返回值的map就是json和界面的所有可以返回的对象
@Override
public Map<String, Object> getErrorAttributes(WebRequest webRequest, boolean includeStackTrace) {
Map<String, Object> map = super.getErrorAttributes(webRequest, includeStackTrace);
map.put("company","fjnu");
//我们异常处理器携带的数据
Map<String,Object> ext = (Map<String, Object>) webRequest.getAttribute("ext", 0);
map.put("ext",ext);
return map;
}
}
将刚才通过request域保存的信息拿出来,存放在存放默认信息的map里面。
注意,这个MyErrorAttributes类,必须得在容器中,也就是必须在类名上加上@Component注解。这样,才可以在这个容器中拿到保存的错误信息(就像等下下面使用的那样)。
4.拿出定制错误信息:
<h1>staus:[[${status}]]</h1>
<h2>timestamp:[[${timestamp}]]</h2>
<h2>exception:[[${exception}]]</h2>
<h2>message:[[${message}]]</h2>
<h2>ext:[[${ext.code}]]</h2>
<h2>ext:[[${ext.message}]]</h2>
可以看到,不论是系统自带的,还是自己定制的,都可以拿到!
ps:在开发中就可以抛出自定义的异常啦:
@ResponseBody
@RequestMapping("/hello")
public String Hello(@RequestParam("user") String user){
if (user.equals("aaa"))
{
throw new UserNotExistException();//抛出错误就可以来到相应的错误界面
}
return "Hello World!";
}