第一步:编写一个SpringMVC异常处理器起来专门处理异常。请求转发到默认自带的BasicErrorController下面的方法去处理。
@ControllerAdvice
public class MyExceptionHandler {
//可以直接写Exception处理所有异常
@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",400);
map.put("code","user notexist");
map.put("message",e.getMessage());
request.setAttribute("exi",map);
//转发到"/error" ,能够自适应
return "forward:/error";
}
}
第二步:继承DefaultErrorAttributes组件重写getErrorAttributes方法来添加上自己的参数进去,放入到容器中
@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("company","fanren");
//这个方法需要0或1参数,分别代表request、session作用域
Object exi = webRequest.getAttribute("exi", 0);
map.put("exi",exi);
return map;
}
}
第三步:在对应的错误页面(如400.html页面)中取出参数
<main role="main" class="col-md-9 ml-sm-auto col-lg-10 pt-3 px-4">
<h1>status:[[${status}]]</h1>
<h2>time:[[${#dates.format(timestamp,'yyyy-MM-dd HH:mm:ss')}]]</h2>
<h2>error:[[${error}]]</h2>
<h2>message:[[${message}]]</h2>
<h2>company:[[${company}]]</h2>
h2>code:[[${exi.code}]]</h2>
</main>
结果:打开项目中抛出异常处理的链接看响应
浏览器错误响应
客户端错误响应