原理:略
定制错误html页面
在有thymeleaf模板引擎下:
1、在template下创建error目录,在error目录中,创建404.html页面,如果发生错误代码为404,就会去找这个页面(可以创建所有的状态码页面)
2、在error目录中,创建4xx.html页,如果找不到对应的状态码页面,就会去找4xx.html页面(注意4xx.html就是4xx)
<body>
获取时间戳 [[${timestamp}]] <br/>
获取状态码 [[${status}]] <br/>
获取错误信息 [[${error}]] <br/>
获取异常对象 [[${exception}]] <br/>
获取异常信息 [[${message}]] <br/>
JSR303数据验证错误 [[${errors}]] <br/>
</body>
在没有thymeleaf模板引擎下:
在static下创建error目录,在error目录中,创建404.html页面,如果发生错误代码为404,就会去找这个页面(可以创建所有的状态码页面)
只是不能 [[${timestamp}]] 通过这样获取错误信息了
定制错误json数据
application.properties (SpringBoot 2.x),如果没有特殊需求,默认false也是可以的
server.error.include-exception=true //保证 [[${exception}]] 可以获取到数据
1、创建自定义错误对象
public class Myexception extends RuntimeException {
public Myexception() {
super("错误消息");
}
}
2、contoller
@RequestMapping(value = "userlist")
public String userlist(){
if (true){
throw new Myexception(); //模拟服务器发生错误
}
}
3.1如果抛出服务器错误没有被处理,就会返回5xx.html文件
5xx.html
<body>
获取时间戳 [[${timestamp}]] <br/>
获取状态码 [[${status}]] <br/>
获取错误信息 [[${error}]] <br/>
获取异常对象 [[${exception}]] <br/> //可以获取到异常的对象了
获取异常信息 [[${message}]] <br/> //可以获取到异常的消息了
JSR303数据验证错误 [[${errors}]] <br/>
</body>
3.2 处理服务器抛出的错误,直接返回一个json数据,上面配置的html失效(注意:此时浏览器和客户端返回的都是json数据)
@ControllerAdvice
public class MyExceptionHandler {
@ResponseBody
@ExceptionHandler //@ExceptionHandler(MyException.class)处理某一个错误
public Map<String,Object> handleException(Exception e){
Map<String, Object> map = new HashMap<>();
map.put("code",400);
map.put("message","请求出现错误");
return map;
}
}
3.3 如果需要浏览器访问返回html,客户端返回json
@ControllerAdvice
public class MyExceptionHandler {
@ExceptionHandler
public String handleException(Exception e, HttpServletRequest request){
//重定向到/error的时候需要手动设置状态码,默认javax.servlet.error.status_code=200
request.setAttribute("javax.servlet.error.status_code",404);
//可以给MyErrorAttributes传入数据;
Map<String, Object> map = new HashMap<>();
request.setAttribute("map",map);
return "forward:/error";
}
}
@Component
class MyErrorAttributes extends DefaultErrorAttributes{
@Override
public Map<String, Object> getErrorAttributes(WebRequest webRequest, boolean includeStackTrace) {
//如果不需要自带的错误返回消息,可以不用继承,自己new LinkedHashMap<>();返回它就可以了
Map<String, Object> map = super.getErrorAttributes(webRequest, includeStackTrace);
//可以直接创建数据
map.put("code",404);
map.put("message","请求错误");
//可以从handleException中获取数据
Object map1 = webRequest.getAttribute("map", 0);
map.put("map1",map1);
return map;
}
}