SpringBoot错误页配置及项⽬全局错误处理
解决俩个问题:
1> ⽤户体验:当我们请求路径写错时,浏览器显⽰⼀个"Whitelabel Error Page",对⽤户来说体验不友好。
2> 错误码分类:当浏览器请求出现异常时,有时不仅仅是400/404/500..还有Exception异常,对程序员来说不容易识别错误,此 时考虑增加全局错误处理。
⼀解决⽤户体验问题
以编程⽅式配置嵌⼊式servlet容器,可以通过注册实现 WebServerFactoryCustomizer 接⼝的Spring bean,该接⼝可以直接修改servlet 容器配置。例如:
⽹络设置:传⼊HTTP请求的侦听端⼝(server.port),要绑定的接⼝地址server.address,等等。
会话设置:会话是持久性(server.servlet.session.persistence),会话超时(server.servlet.session.timeout),会话数据
(server.servlet.session.store-dir)的位置以及会话cookie配置(server.kie.*)。
错误管理:错误页⾯的位置(path)
⾸先创建⼀个错误页控制类:MyErrorPageController.java
ller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class MyErrorPageController {
@RequestMapping("error-404")
public String toPage404(){
return "error/error-404";
}
@RequestMapping("error-400")
public String toPage400(){
return "error/error-400";
}
@RequestMapping("error-500")
public String toPage500(){
return "error/error-500";
}
}
然后创建错误页类:MyErrorPageConfig.java
fig;
import org.springframework.boot.web.server.ConfigurableWebServerFactory;
import org.springframework.boot.web.server.ErrorPage;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import t.annotation.Bean;
import t.annotation.Configuration;
import org.springframework.http.HttpStatus;
@Configuration
public class MyErrorPageConfig {
/**
* 以编程⽅式配置嵌⼊式servlet容器,可以通过注册实现该 WebServerFactoryCustomizer 接⼝的Spring bean
* TomcatServletWebServerFactory,JettyServletWebServerFactory并且UndertowServletWebServerFactory 是专⽤变体, ConfigurableServletWebServerFactory分别为Tomcat,Jetty和Undertow提供了额外的⾃定义setter⽅法。
* @return
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableWebServerFactory> webServerFactoryCustomizer() {
return new WebServerFactoryCustomizer<ConfigurableWebServerFactory>() {
@Override
public void customize(ConfigurableWebServerFactory factory) {
// 对嵌⼊式servlet容器的配置
/
/ factory.setPort(8081);
/* 注意:new ErrorPage(stat, path);中path必须是页⾯名称,并且必须“/”开始。
底层调⽤了String.java中如下⽅法:
public boolean startsWith(String prefix) {
return startsWith(prefix, 0);
}*/
ErrorPage errorPage400 = new ErrorPage(HttpStatus.BAD_REQUEST,
"/error-400");
ErrorPage errorPage404 = new ErrorPage(HttpStatus.NOT_FOUND,
"/error-404");
ErrorPage errorPage500 = new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR,
"/error-500");
factory.addErrorPages(errorPage400, errorPage404,
errorPage500);
}
};
}
}
最后创建相关的页⾯:error/error-404.html/error/error-400.html/error/error-500.html
<!DOCTYPE html>
<html xmlns:th="">
<head>
<meta charset="UTF-8"/>
<title>愿世界没有Bug</title>
</head>
<body>
<h1>对不起遇到了错误400</h1>
</body>
</html>
其他页⾯雷同
接下来验证我们的错误页:输⼊错误的访问路径,F12查看请求过程及页⾯展⽰!
成功
⼆解决错误码分类问题
⾸先定义⼀个错误的对象信息:ErrorInfo.java
ample.demo.bean;
public class ErrorInfo {
// 错误类别码
public Integer code;
// 错误信息
public String message;
// 映射路径
public String url;
// get/set⽅法省略
}
然后创建⼀个控制层切⾯错误处理类:GlobalExceptionHandler.java
ample.demo.advice;
ample.demo.bean.ErrorInfo;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
@ControllerAdvice // 作为⼀个控制层的切⾯处理server error啥意思
// @RestControllerAdvice // Rest风格,作为⼀个控制层的切⾯处理
public class GlobalExceptionHandler {
private static final String DEFAULT_ERROR_VIEW = "error"; // 定义错误显⽰页,error.html private static final Integer INIT_ERROR_CODE = 500; // 定义初始错误码
@ExceptionHandler(value = Exception.class) // 所有的异常都是Exception⼦类
public ModelAndView defaultErrorHandler(HttpServletRequest request, Exception e) {
ModelAndView mv = new ModelAndView(DEFAULT_ERROR_VIEW);
Integer errorCode = INIT_ERROR_CODE;
// 可以⾃⼰定制错误分类对象信息
ErrorInfo errorInfo = new ErrorInfo();
// 对错误类型进⾏分类
String header = Header("content-type");
if(header != null && ains("json")){
errorCode = 300; // json异常
} else if (e instanceof ArithmeticException) {
errorCode = 100; // 算术异常
} else if (e instanceof NullPointerException) {
errorCode = 200; // 空指针异常
} else {
errorCode = 999; // 其他异常
}
// 对错误码进⾏判断
switch (errorCode) {
case 100:
errorInfo.setCode(errorCode); // 将错误码传递过去
break;
case 200:
errorInfo.setCode(errorCode); // 将错误码传递过去
break;
case 300:
errorInfo.setCode(errorCode); // 将错误码传递过去
break;
case 500:
errorInfo.setCode(INIT_ERROR_CODE); // 将错误码传递过去
break;
case 999:
errorInfo.setCode(INIT_ERROR_CODE); // 将错误码传递过去
break;
default:
errorInfo.setCode(1000); // 将错误码传递过去
break;
}
errorInfo.Message());// 将异常对象传递过去
errorInfo.RequestURL().toString());// 获得请求的路径
mv.addObject("errorInfo", errorInfo);
mv.setViewName("error/"+DEFAULT_ERROR_VIEW);
return mv;
}
}
最后创建错误页⾯:error/error.html
<!DOCTYPE html>
<html xmlns:th="">
<head>
<meta charset="UTF-8"/>
<title>愿世界没有Bug</title>
</head>
<body>
<h1>Sorry,异常了(⾃定义)</h1>
<div>
<p th:text="'错误码:' + ${de}"/>
<p th:text="'映射路径:' + ${errorInfo.url}"/>
<p th:text="'错误信息:' + ${ssage}"/>
</div>
</body>
</html>
@RequestMapping(value = "/mul")
public int mulParam(int param) {
return 9/param;
}
访问结果如下图:
如此可以将所有异常信息展⽰出来,或是后台搞到数据库中,查问题时,根据错误码,错误信息精准定位问题。不需要程序员对所有的Exception都了解。上⼿简单,排难精准。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论