SpringBoot全局异常使用
自定义错误界面
Springboot自带的错误提示界面不太友好, 我们自己实现错误界面.
在src/main/resources/static 下面新建自定义错误页面404.html, 具体代码如下图所示:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div class="text" style="text-align: center">
主人, 我累了, 让我休息一会!!!
</div>
</body>
</html>
然后新建ErrorPageConfig配置类, 具体代码如下图所示:
@Configuration
public class ErrorPageConfig {
@Bean
public WebServerFactoryCustomizer<ConfigurableWebServerFactory> customizer(){
return new WebServerFactoryCustomizer<ConfigurableWebServerFactory>() {
@Override
public void customize(ConfigurableWebServerFactory factory) {
ErrorPage errorPage = new ErrorPage(HttpStatus.NOT_FOUND, "/404.html");
factory.addErrorPages(errorPage);
}
};}
}
我的Controller
@RestController @RequestMapping("/start") public class TestController { }
然后在随便选择一个uri来访问, 让程序返回404, 如浏览器访问
http://localhost:8080/start/sss
, 结果如下图:
可以看到,已经达到自定义错误界面, 然后你可以自己美化一番.
全局异常处理
在项目中我们会遇到各种各样的业务处理, 我们希望这些异常能被统一处理.
统一封装自定义业务异常BusinessException, 该类继承自
RuntimeException
异常类,并提供带有异常信息的构造方法, 具体代码如下:
public class BusinessException extends RuntimeException{
public BusinessException(){}
public BusinessException(String message){
super(message);
}
}
然后新建错误信息类ErrorInfo, 该类用于封装错误信息, 包括错误码, 具体代码如下:
public class ErrorInfo<T> {
public static final Integer SUCCESS = 200;
public static final Integer ERROR = 100;
//错误码
private Integer code;
//错误信息
private String message;
private String url;
private T data;
//省略getter setter方法
}
其次, 新建一个统一异常处理类
GlobalDefaultExceptionHandler
, 具体代码如下:
/**
* 描述: 统一业务异常处理类
* @Author wuwei
* @Date 2019/12/8 10:47 下午
*/
@RestControllerAdvice(basePackages = {"com.example.activemq.demo",})
public class GlobalDefaultExceptionHandler {
@ExceptionHandler({BusinessException.class})
//如果返回为json数据,就添加该注解
@ResponseBody
public ErrorInfo defaultErrorHandler(HttpServletRequest req, Exception e){
ErrorInfo errorInfo = new ErrorInfo();
errorInfo.setMessage(e.getMessage());
errorInfo.setUrl(req.getRequestURI());
errorInfo.setCode(ErrorInfo.SUCCESS);
return errorInfo;
}
}
@RestControllerAdvice
: 定义统一的异常处理类,basePackages
属性用于定义扫描哪些包, 默认可不配置.@ExceptionHandler
:用于定义方法 针对 的异常类型, 可以传入多个需要捕获的异常类, 我们这就只处理前面自定义的BusinessException
这个异常类.@ResponseBody
: 如果返回的为json数据或其他对象, 就添加该注解.
然后在
Controller
里定义一个方法, 该方法手动抛出我们自定义的BusinessException
异常,具体代码如下:
/**
* @Author wuwei
* @Date 2019/12/8 10:24 下午
*/
@RestController
@RequestMapping("/start")
public class TestController {
@RequestMapping("/findAll")
public String findAll(){
throw new BusinessException("业务异常");
}
}
测试
然后我们在浏览器中请求这个方法, 浏览器输入 http://localhost:8080/start/findAll
结果图如下:
okay, 我们已经达到了处理异常的目的.
Over
如果觉得需要更多技术干货, 来我的博客 和 GitHub哦
CSDN: https://println.tk/
Github: https://github.com/uweii