定制错误json数据
客户端访问
如果,程序出错了
返回的json数据,需要定制的
定制错误页面
在模板文件夹、或者静态资源文件夹下
放置一个error文件夹,里面存放错误状态码对应的页面
这些页面,就是错误页面
在错误页面,可以获取相关的错误信息
自定义异常
UserNotExistException
为了使异常抛出,继承运行时异常
写一个无参的构造器,调用super,传递一个message
package com.atguigu.springboot.exception;
public class UserNotExistException extends RuntimeException {
public UserNotExistException() {
super("用户不存在");
}
}
Controller
根据指定用户,抛出自定义的异常
@ResponseBody
@RequestMapping("/hello")
public String hello(@RequestParam("user") String user){
if(user.equals("aaa")){
throw new UserNotExistException();
}
return "Hello World";
}
定义错误页面
<main role="main" class="col-md-9 ml-sm-auto col-lg-10 pt-3 px-4">
<h1>status:[[${status}]]</h1>
<h2>timestamp:[[${timestamp}]]</h2>
<h2>exception:[[${exception}]]</h2>
<h2>message:[[${message}]]</h2>
</main>
浏览器访问
自定义异常处理器
MyExceptionHandler
专门用来处理异常,需要添加@ControllerAdvice注解
处理什么异常,需要添加@ExceptionHandler注解
参数,直接写Exception,表示处理所有异常
@ControllerAdvice
public class MyExceptionHandler {
//1、浏览器客户端返回的都是json
@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;
}
}
客户端访问
返回自定义,错误json数据
访问页面
也是返回自定义,错误json数据
缺点
没有自适应效果
浏览器,客户端返回的都是json数据
ErrorMvcAutoConfiguration
错误自动配置
BasicErrorController
处理/error请求
/error请求是自定义的
浏览器,返回页面
客户端,返回json数据
MyExceptionHandler
修改自定义异常处理器
转发到/error请求
@ControllerAdvice
public class MyExceptionHandler {
//1、浏览器客户端返回的都是json
// @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;
// }
@ExceptionHandler(UserNotExistException.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("code", "user.notexist");
map.put("message", "用户出错啦");
request.setAttribute("ext", map);
//转发到/error
return "forward:/error";
}
}
注意
需要传入,异常的错误状态码
不传的话,默认状态码为200
跳转到默认页面
存在问题
定制的错误数据,无法携带出去