我项目使用过程中,我们不希望我们的错误页面是springboot内置的,因此需要自己定制错误页面;
默认效果:
1)、浏览器,返回一个默认的错误页面

这是代表浏览器请求,返回的是springboot内置的错误页面;

{
"timestamp": "2020-11-29T13:40:06.107+0000",
"status": 404,
"error": "Not Found",
"message": "No message available",
"path": "/crud/aaa"
}
这是利用postman模仿客户端请求返回的json

springboot根据请求头返回了不同的内容,但是页面和json都不是我们自己定义的,我们需要自己定义来实现这个功能;
方法一:直接在templates中定义error/404.html,4xx.html,500.html,5xx.html
这样,springboot会通过默认的自动错误页面处理找到该模板;
原理:
可以参照ErrorMvcAutoConfiguration;错误处理的自动配置;
给容器中添加了以下组件
1、DefaultErrorAttributes:
帮我们在页面共享信息;
@Override
public Map<String, Object> getErrorAttributes(RequestAttributes requestAttributes,
boolean includeStackTrace) {
Map<String, Object> errorAttributes = new LinkedHashMap<String, Object>();
errorAttributes.put("timestamp", new Date());
addStatus(errorAttributes, requestAttributes);
addErrorDetails(errorAttributes, requestAttributes, includeStackTrace);
addPath(errorAttributes, requestAttributes);
return errorAttributes;
}
2、BasicErrorController:处理默认/error请求
@Controller
@RequestMapping("${server.error.path:${error.path:/error}}")
public class BasicErrorController extends AbstractErrorController {
@RequestMapping(produces = "text/html")//产生html类型的数据;浏览器发送的请求来到这个方法处理
public ModelAndView errorHtml(HttpServletRequest request,
HttpServletResponse response) {
HttpStatus status = getStatus(request);
Map<String, Object> model = Collections.unmodifiableMap(getErrorAttributes(
request, isIncludeStackTrace(request, MediaType.TEXT_HTML)));
response.setStatus(status.value());
//去哪个页面作为错误页面;包含页面地址和页面内容
ModelAndView modelAndView = resolveErrorView(request, response, status, model);
return (modelAndView == null ? new ModelAndView("error", model) : modelAndView);
}

最低0.47元/天 解锁文章
339

被折叠的 条评论
为什么被折叠?



