定制错误处理界面&数据
1、定制错误页面(浏览器请求返回错误页面)
-
templates文件夹下新建error文件夹(使用模板引擎)
-
新建4XX.html和5XX.html文件
-
页面能获取到的信息:
timestamp:时间戳
status:状态码
error:错误提示
exception:异常对象
message:异常消息
errors:JSR303数据校验的错误都在这里
<h1>status:[[${status}]]</h1> //显示错误状态码 <h2>timestamp:[[${timestamp}]]</h2> //显示错误时间戳 <h2>error:[[${error}]]</h2>
2、定制错误的json数据
2.1、自定义异常处理&返回定制json数据
SpringBoot2.0版本以上配置自定义异常需要在配置文件中配置:server.error.include-exception=true
2.1.1、通过异常机制定制错误返回数据(客户端、浏览器全部返回json数据,不会自适应)
新建自定义xx异常
public class UserNotExistException extends RuntimeException {
public UserNotExistException() {
super("用户不存在");
}
}
新建自定义异常处理器
//@ControllerAdvice: 要成为异常处理器需要添加此注解
public class MyExceptionHadnler {
@ResponseBody
//@ExceptionHandler(xx.class)表明需要处理的xx异常
@ExceptionHandler(UserNotExistException.class)
//参数Exception e 获取到异常处理信息
public Map<String,Object> handleException(Exception e){
Map<String,Object> map = new HashMap<>();
map.put("massage",e.getMessage());
map.put("自定义异常信息","====**====");
return map;
}
}
访问效果(没有自适应效果)
浏览器:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m96CSk6r-1690591955220)(C:\Users\10149\AppData\Roaming\Typora\typora-user-images\image-20200324112455320.png)]
客户端:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3CjPzemR-1690591955221)(C:\Users\10149\AppData\Roaming\Typora\typora-user-images\image-20200324112427984.png)]
2.1.2、通过转发到"/error"请求(能自适应浏览器和客户端)
不默认返回json数据而是转发到"/error"请求
SpringBoot默认对/error请求进行自适应(详情见《SpringBoot错误处理机制原理》)
新建自定义xx异常:
public class UserNotExistException extends RuntimeException {
public UserNotExistException() {
super("用户不存在");
}
}
新建自定义异常处理器:
@ControllerAdvice
public class MyExceptionHadnler {
@ExceptionHandler(UserNotExistException.class)
public String handleException(Exception e, HttpServletRequest request) {
Map<String, Object> map = new HashMap<>();
/*
*Integer statusCode = (Integer) request
*.getAttribute(javax.servlet.error.status_code)
**/
//需要传入错误的状态码
request.setAttribute("javax.servlet.error.status_code",500);
map.put("code", "====**====");
map.put("massage", "SSSS");
//将自定义错误信息数据放在请求域中
request.setAttribute("ext",map);
//转发到/error请求
return "forward:/error";
}
}
将我们定制的数据携带出去:自定义ErrorAttributes
新建MyErrorAttributes(获取错误属性)类
//给容器中加入我们自己定义的错误属性
@Component
public class MyErrorAttributes extends DefaultErrorAttributes {
@Override
public Map<String, Object> getErrorAttributes(WebRequest webRequest, boolean includeStackTrace) {
Map<String, Object> map = super.getErrorAttributes(webRequest, includeStackTrace);
//添加自定义错误信息
map.put("Mr_W", "111");
/*
* 接收上面我们自定义异常处理器携带的数据
* 0:代表从请求域中获取数据,1:代表从session域中获取数据
* */
Map<String,Object> ext = (Map<String, Object>) webRequest.getAttribute("ext", 0);
map.put("ext",ext);
//返回的map就是页面和json能获取的所有字段
return map;
}
}
前端获使用thymeleaf取数据
<h1>status:[[${status}]]</h1>
<h2>timestamp:[[${timestamp}]]</h2>
<h2>exception:[[${exception}]]</h2>
<h2>message:[[${message}]]</h2>
<h2>ext:[[${ext.code}]]</h2>
<h2>ext:[[${ext.massage}]]</h2>
访问效果:
浏览器
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GHloOZxq-1690591955221)(C:\Users\10149\AppData\Roaming\Typora\typora-user-images\image-20200324130341569.png)]
客户端
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mEZwZyuV-1690591955222)(C:\Users\10149\AppData\Roaming\Typora\typora-user-images\image-20200324130419192.png)]