1 定制错误的页面
(1) 有模板引擎的情况下:error/状态码。
【将错误页面命名为 :错误状态码.html 放在模板引擎文件夹里面的error文件夹下】,发生此状态码的错误就会来到 对应的页面;
我们可以使用4xx和5xx作为错误页面的文件名来匹配这种类型的所有错误,精确优先(优先寻找精确的状态码.html);
页面能获取的信息:
timestamp:时间戳;
status:状态码;
error:错误提示;
exception:异常对象;
message:异常消息;
errors:JSR303数据校验的错误都在这里;
(2)没有模板引擎(或者模板引擎找不到这个错误页面):在静态资源文件夹下找。
(3)在以上两种情况下都没有找到错误页面,就默认跳转到SpringBoot默认的错误提示页面。
2 定制json数据
(1)自定义异常处理&返回定制json数据
@ControllerAdvice
public class MyExceptionHandler {
@ResponseBody
@ExceptionHandler(UserNotExistException.class)
public Map handleException(Exception e){
Map map = new HashMap<>();
map.put("code","user.notexist");
map.put("message",e.getMessage());
return map;
}
}
//没有自适应效果...
(2)转发到/error进行自适应响应效果处理
@ExceptionHandler(UserNotExistException.class)
public String handleException(Exception e, HttpServletRequest request){
Map 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",e.getMessage());
//转发到/error
return "forward:/error";
}
(3)将我们的定制数据携带出去
出现错误以后,会来到/error请求,会被BasicErrorController处理,响应出去可以获取的数据是由
getErrorAttributes得到的(是AbstractErrorController(ErrorController)规定的方法)。
a 完全来编写一个ErrorController的实现类【或者是编写AbstractErrorController的子类】,放在容器中;
b 页面上能用的数据,或者是json返回能用的数据都是通过errorAttributes.getErrorAttributes得到;
采用b方法,容器中DefaultErrorAttributes.getErrorAttributes(),默认进行数据处理的。
自定义ErrorAttributes,如下:
//给容器中加入我们自己定义的ErrorAttributes
@Component
public class MyErrorAttributes extends DefaultErrorAttributes {
@Override
public Map getErrorAttributes(RequestAttributes requestAttributes,
boolean includeStackTrace) {
Map map = super.getErrorAttributes(requestAttributes,
includeStackTrace);
map.put("company","atguigu");
return map;
}
}
最终的效果:响应是自适应的,可以通过定制ErrorAttributes改变需要返回的内容,