在BasicErrorController.java中
/**
* 默认通过 /error 进入此Controller
*/
@Controller
@RequestMapping("${server.error.path:${error.path:/error}}")
public class BasicErrorController extends AbstractErrorController {
private final ErrorProperties errorProperties;
// 当页面访问出现异常时,返回的是视图
@RequestMapping(produces = MediaType.TEXT_HTML_VALUE)
public ModelAndView errorHtml(HttpServletRequest request, HttpServletResponse response) {
HttpStatus status = getStatus(request);
Map<String, Object> model = Collections
.unmodifiableMap(getErrorAttributes(request, getErrorAttributeOptions(request, MediaType.TEXT_HTML)));
response.setStatus(status.value());
ModelAndView modelAndView = resolveErrorView(request, response, status, model);
return (modelAndView != null) ? modelAndView : new ModelAndView("error", model);
}
// 当是客户端调用出现异常时,返回的是json数据
@RequestMapping
public ResponseEntity<Map<String, Object>> error(HttpServletRequest request) {
HttpStatus status = getStatus(request);
if (status == HttpStatus.NO_CONTENT) {
return new ResponseEntity<>(status);
}
Map<String, Object> body = getErrorAttributes(request, getErrorAttributeOptions(request, MediaType.ALL));
return new ResponseEntity<>(body, status);
}
}
默认由 DefaultErrorViewResolver.java 处理异常页
默认异常页面在error文件夹下的html文件,返回的html的由错误类型决定,由精确匹配(404.html、500.html...)到模糊匹配(4xx.html、5xx.html)
出现异常返回页的查找顺序:
1. 在templates下error文加夹下找;
2. 在静态资源中找;
3. 使用springboot默认的错误空白页。
虽然可以使用@ControllerAdvice和@ExceptionHandler统一处理异常,但现实业务复杂,对于不同的异常会做出不同的反应处理,要求多样化,所以并不一定适合多样定制化的异常处理。