让我来详细讲解“SpringBoot异常错误页面实现方法介绍”的完整攻略。
1. 实现方式介绍
SpringBoot提供了两种方式来实现异常错误页面:
1.1 自定义ErrorController
通过自定义ErrorController的方式,我们可以根据异常类型,异常状态码或者URL地址来进行异常信息的处理和跳转。这个方法需要手动实现异常信息的处理和跳转,处理方式可以是页面跳转或者返回JSON等形式。
@Controller
@RequestMapping("${server.error.path:${error.path:/error}}")
public class CustomErrorController implements ErrorController {
private final ErrorAttributes errorAttributes;
@Autowired
public CustomErrorController(ErrorAttributes errorAttributes) {
this.errorAttributes = errorAttributes;
}
@RequestMapping(produces = MediaType.TEXT_HTML_VALUE)
public ModelAndView errorHtml(HttpServletRequest request, Model model) {
HttpStatus status = getStatus(request);
Map<String, Object> errorMap = getErrorAttributes(request, isIncludeStackTrace(request, MediaType.TEXT_HTML));
model.addAttribute("errorCode", status.value());
model.addAttribute("errorMsg", errorMap.get("message"));
return new ModelAndView("error");
}
@RequestMapping
public ResponseEntity<Map<String, Object>> error(HttpServletRequest request) {
HttpStatus status = getStatus(request);
Map<String, Object> errorMap = getErrorAttributes(request, isIncludeStackTrace(request, MediaType.ALL));
return ResponseEntity.status(status).body(errorMap);
}
@Override
public String getErrorPath() {
return "/error";
}
private Map<String, Object> getErrorAttributes(HttpServletRequest request,
boolean includeStackTrace) {
RequestAttributes requestAttributes = new ServletRequestAttributes(request);
return this.errorAttributes.getErrorAttributes(requestAttributes, includeStackTrace);
}
private boolean isIncludeStackTrace(HttpServletRequest request,
MediaType produces) {
return true;
}
private HttpStatus getStatus(HttpServletRequest request) {
Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code");
if (statusCode != null) {
try {
return HttpStatus.valueOf(statusCode);
}
catch (Exception ex) {
ex.printStackTrace();
}
}
return HttpStatus.INTERNAL_SERVER_ERROR;
}
}
这里我们通过自定义Controller的方式实现了异常信息的处理和跳转。当发生异常时,会跳转到我们定义的error
页面,并将错误信息传递给模板引擎进行渲染。
1.2 集成ErrorPageRegistrar接口
除了自定义ErrorController,我们还可以通过实现ErrorPageRegistrar
接口的方式来定制化我们的异常处理页面。这个方法需要在SpringBoot启动时手动初始化,并设置需要处理的异常状态码和跳转的页面地址。
@Configuration
public class WebConfig implements ErrorPageRegistrar {
@Override
public void registerErrorPages(ErrorPageRegistry errorPageRegistry) {
errorPageRegistry.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND, "/404.html"));
errorPageRegistry.addErrorPages(new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR, "/500.html"));
errorPageRegistry.addErrorPages(new ErrorPage("/error.html"));
}
}
这里我们通过实现ErrorPageRegistrar
接口的方式,注册了三个异常页面,分别是404.html
,500.html
和error.html
。分别对应了NOT_FOUND
、INTERNAL_SERVER_ERROR
以及其他未处理的异常。
2. 示例说明
2.1 示例1:自定义错误页面
@RequestMapping("/test")
public String test() {
throw new RuntimeException("发生异常了...");
}
在上面代码中,我们定义了一个/test
的请求,当访问此请求时,抛出一个RuntimeException异常,并将异常信息传递给自定义的error
页面进行渲染。
error.html
<html>
<head>
<title>自定义异常错误处理页面</title>
</head>
<body>
<h2>出错了!!!</h2>
<p>错误码:${errorCode}</p>
<p>错误信息:${errorMsg}</p>
</body>
</html>
当访问/test
时,我们会跳转到自定义的error
页面,页面会显示异常状态码和异常信息。
2.2 示例2:集成错误页面
在本示例中,我们使用ErrorPageRegistrar
接口方式来实现集成错误页面。当用户访问不存在的地址或者发生服务器错误时,将跳转到相应的错误页面。
application.properties
server.error.whitelabel.enabled=false
这里我们需要在application.properties
中禁用SpringBoot默认的错误页面,以免和我们自定义的页面冲突。
WebConfig.java
@Configuration
public class WebConfig implements ErrorPageRegistrar {
@Override
public void registerErrorPages(ErrorPageRegistry errorPageRegistry) {
errorPageRegistry.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND, "/404.html"));
errorPageRegistry.addErrorPages(new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR, "/500.html"));
errorPageRegistry.addErrorPages(new ErrorPage("/error.html"));
}
}
在我们定义的WebConfig
中,我们通过实现ErrorPageRegistrar
接口来注册我们的异常处理页面。当访问不存在的地址时,将跳转到404.html
页面;当服务器发生错误时,将跳转到500.html
页面;其他未处理的异常将跳转到error.html
页面。
这样,我们就实现了SpringBoot的错误页面处理功能。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot异常错误页面实现方法介绍 - Python技术站