开发者学堂课程【SpringBoot快速掌握 - 核心技术:定制错误数据】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/612/detail/9257
定制错误数据
一、 如何定制错误的页面
1、有模板引擎的情况
error/状态码;【将错误页面命名为 错误状态码.html放在模板引擎文件夹里面的error文件夹下】,发生状态码的错误就会来到对应的页面。
示例:
在模板引擎文件夹下面或者静态文件下,来放一个error文件夹,在error里面放上错误状态码,这个页面就是定制的错误页面。且能在里面取出相关的错误信息。
二、定制错误数据的操作
1、首先来先写一个异常
packge
com.atguigu.springboot.exception;
p
ublic class UserNotExisException extends RuntimeException
//为了异常能够抛出去,让它来继承运行时异常
{
public UserNotExistException()
//无参构造器
{
super(“
用户不存在
”)
;
}
}
定义controller:
@ResponseBody
@RequestMapping("/hello")
浏览器地址输localhost:8080/crud/hello?user=aaa
,就会来到controller并抛出UserNotExistException异常。
定义处理UserNotExistException的controller:
MyExceptionHandler.java
:
@ResponseBody
@ExceptionHandler(UserNotExistException.class)
public Map<String, Object>
handleException(Exception e){
Map<String, Object> map = new HashMap<>();
map.put("code", "user.notexist");
map.put("message", e.getMessage());
return map;
}
定制错误数据 code 以 及 message。方法返回值的类型是json。这样的定制错误数据,浏览器或客户端返回的都是json类数据。
public String hello(@RequestParam("user")String user){
if(user.equals("aaa")){
throw new UserNotExistException();
}
return "hello world!";
}
p
ackage com.atgui
gu
.springboot.controller;
i
mport com.atguigu.springboot.exception.UserNotExistExcepetion;
i
mport org.springframework.web.bind.annotation.ControllerAdvice;
i
mport org.springframework.web.bind.annotation.E
x
ceptionHandler;
i
mport
org.springframework.web.bind.annotation.ResponseBody;
i
mport java.util.HashMap;
i
mport java.util.Map;
在错误页面获取某些错误信息:
<h1>status:[[ ${status} ]]</h1>
<h2>timestamp:[[ ${timestamp} ]]</h2>
<h2>exception:[[ ${exception} ]]</h2>
<h2>message:[[ ${message} ]]</h2>
如何响应出自己的 json 数据;
1. 接下来写一个异常处理器;
Pcakage com.atguigu.springboot.controller;
Import org. springframework. web.bind. annotation. contreraadvices;
@
ControllerAdvice
p
ublic class MyExceptionHandler{
//浏览器的返回的都是json
@ResponseBody
@ExceptionHandler(UserNotExisException.class)
//处理异常
public Map<String,Object> handleException(Exception e){
Map<String,Object> map = new HashMap<>();
map.put(“code”,”user.notexist”);
//放入自己的状态码
map.put(“message”,e.getMessage());
//放入异常消息
return map;
//返回json数据
}
}
/
/
没有自适应效果
…
如果是浏览器访问则返回页面,如果是其他客户端返回json 数据
2.转发到 /error 进行自适应响应效果处理
@
ExceptionHandler(UserNotExistException.class)
public String handleException(Exception e,HttpServleRequest request){
Map<String,Object> map = new HashMap<>();
//
传入自己的错误代码
4
xx
5
xx,否则不会进入定制错误页面的解析流程
/
**
*Integer statuCode = (Integer) request
.
getAttribute(“javax.servlet.error.status_code”);
*/
r
equest.setAttribute(“javax.servlet.error.status_code”,500);
map.put(“code,”user.notexist);
map.put(“message”,e.getHessage());
//
转发到/error
return
“forward;//error”;
}
改进定制错误数据-自适应:
只需将controller方法的返回值改成返回到/error,相当于发送了error请求,这样BasicErrorController就会根据Request Headers请求头的Accept属性决定发送哪种类型的错误视图,是发json数据,还是发text/html数据。
3.将我们的定制数据携带出去;
出现错误以后,会来到/error请求,会被basiccontroller处理,响应出去的数据是由geterrorattributes得到的(AbstracErrorController(ErrorController)规定的方法);
(1)完全来编写一个ErrorController的实现类【或者试编写AbstractErrorController的子类】,放在容器中;
(2)页面上能用的数据,或者是json返回能用的数据都是通过errorAtrributes.getErrorAttributes得到;
示例:
//给容器中加入我们自己定义的错误属性
@component
Public class MyerrorAttributes extends DefaultErrorAttributus{
@override
Public map<string,object>getErrorAttributes(RequestAttributes requestAttributes,boolean includeStackTrace);
Super.getErrorAttributes(requestAttributes,includeStackTrace);
Return
Super.getErrorAttributes(requestAttributes,includeStackTrace)
(3)自定义ErrorAttributus
@component
Public class MyerrorAttributes extends DefaultErrorAttributus{
//返回值的map就是页面和json能获取的所有字段
@override
Public map<string,object>getErrorAttributes(RequestAttributes requestAttributes,boolean includeStackTrace);
{
Map<string,object>map= super.getErrorAttributes(requestAttributes,includeStackTrace)
Map.put(
“
company
”
,
“
atguigu
”
);
//我们的异常处理器携带的数据
Map<string,object>ext=rquestAttributes.getAttribute(name:”ext”,scope:0);//我们从请求域中获取一个属性。这个方法要传两个参数,传入0就是代表从request域中。
Map.put(
“
ext
”
,ext);//放进整个要返回的map中
Return map;
}
最终的效果:响应是自适应的,可以通过定制ErrorAttributes改变需要返回的内容