Spring Boot是一个非常流行的Java框架,其主要优点之一是非常简单地设置全局异常处理程序。本文将在解释全局异常处理的基本概念的基础上,提供两个示例,以帮助你更好地理解和使用此功能。
深入聊一聊Spring Boot项目全局异常处理那些事儿
Spring Boot是一个非常流行的Java框架,其主要优点之一是非常简单地设置全局异常处理程序。本文将在解释全局异常处理的基本概念的基础上,提供两个示例,以帮助你更好地理解和使用此功能。
SpringBoot全局异常处理基础知识
全局异常处理是指在整个应用程序中捕获并处理抛出的异常。对于Java应用程序而言,全局异常处理在某些情况下非常重要,因为它可以大大提高应用程序的可靠性。
Spring Boot的全局异常处理主要通过自定义异常处理器实现。在Spring中,异常处理器主要通过实现HandlerExceptionResolver
接口来实现。Spring Boot则提供了一个更简单的方式来处理异常:通过添加@ControllerAdvice
注解的类。
@ControllerAdvice
是一个用于定义@ExceptionHandler
、@InitBinder
和@ModelAttribute
方法的注解。其中,@ExceptionHandler
被用于处理异常。
以下是一些基本的全局异常处理方法。
@ControllerAdvice
public class GlobalExceptionHandler {
//处理RuntimeException并返回错误信息 HTTP状态码为500
@ExceptionHandler(RuntimeException.class)
@ResponseBody
public String handleRuntimeException(RuntimeException ex) {
return "系统错误:"+ex.getMessage();
}
//处理自定义异常CustomException并返回错误信息 HTTP状态码为400
@ExceptionHandler(CustomException.class)
@ResponseBody
public String handleCustomException(CustomException ex) {
return "自定义异常:"+ex.getMessage();
}
}
上述代码演示了如何定义全局异常处理方法。在这个例子中,我们使用了@ControllerAdvice
注解来定义一个全局异常处理程序并处理RuntimeException
和自定义异常CustomException
,并且返回特定的错误文本。
具体实现
通常情况下,我们定义全局异常处理程序的实际过程如下:
- 创建异常类并继承
RuntimeException
或Exception
,根据异常实际情况实现自定义的异常信息。 - 创建全局异常处理类,通过
@ControllerAdvice
注解来声明类,并添加@ExceptionHandler
注解来指示要处理哪个具体的异常类。 - 处理异常时,可以返回一个特定的错误页面或错误信息。
以下是两个具体的实现示例:
第一个示例
假设在我们的应用程序中,我们有一个自定义的ResourceNotFoundException
异常,它被用于处理用户请求不存在的资源时抛出。在这种情况下,我们可以创建一个全局异常处理类来处理所有的ResourceNotFoundException
异常。代码如下:
自定义异常类
public class ResourceNotFoundException extends RuntimeException {
private String resourceName;
private String fieldName;
private Object fieldValue;
public ResourceNotFoundException(String resourceName, String fieldName, Object fieldValue) {
super(String.format("%s not found with %s : '%s'", resourceName, fieldName, fieldValue));
this.resourceName = resourceName;
this.fieldName = fieldName;
this.fieldValue = fieldValue;
}
public String getResourceName() {
return resourceName;
}
public String getFieldName() {
return fieldName;
}
public Object getFieldValue() {
return fieldValue;
}
}
全局异常处理类
@ControllerAdvice
public class RestExceptionHandler extends ResponseEntityExceptionHandler {
@ExceptionHandler(ResourceNotFoundException.class)
protected ResponseEntity<Object> handleResourceNotFound(
ResourceNotFoundException ex) {
ExceptionResponse response = new ExceptionResponse(ex.getMessage(), HttpStatus.NOT_FOUND);
return new ResponseEntity<Object>(response, HttpStatus.NOT_FOUND);
}
}
ErrorResponse类
public class ExceptionResponse {
private String message;
private HttpStatus status;
public ExceptionResponse(String message, HttpStatus status) {
super();
this.message = message;
this.status = status;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public HttpStatus getStatus() {
return status;
}
public void setStatus(HttpStatus status) {
this.status = status;
}
}
在这个示例代码中,我们使用了一个@ControllerAdvice
注解的类RestExceptionHandler
来定义全局异常处理程序,并添加了@ExceptionHandler
注解来指示要处理ResourceNotFoundException
异常。在异常处理方法中,我们返回了一个ErrorResponse
对象,其中包含了我们定义的异常消息和HTTP响应码。
第二个示例
假设我们的应用程序中有一个自定义的CustomException
异常,它被用于处理我们自己的业务逻辑异常。在这种情况下,我们可以创建一个全局异常处理类来处理所有的CustomException
异常。代码如下:
自定义异常类
public class CustomException extends RuntimeException {
public CustomException(String message) {
super(message);
}
}
全局异常处理类
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(CustomException.class)
public ModelAndView handleCustomException(HttpServletRequest request, Exception ex){
ModelAndView model = new ModelAndView("custom_error");
model.addObject("exception", ex);
model.addObject("url", request.getRequestURL());
return model;
}
}
在这个示例代码中,我们使用了一个@ControllerAdvice
注解的类GlobalExceptionHandler
来定义全局异常处理程序,并添加了@ExceptionHandler
注解来指示要处理CustomException
异常。在处理异常方法中,我们返回一个错误视图和一些附加的数据,例如异常消息和请求URI。
总结
在Spring Boot应用程序中,全局异常处理程序是实现强大和可靠的应用程序的重要组成部分。使用@ControllerAdvice
注解,我们可以轻松地开发自己的全局异常处理程序。
在这篇文章中,我们探讨了全局异常处理程序的基本概念,并给出了两个不同的示例。如有疑问或建议,欢迎留言讨论。
本文标题为:深入聊一聊springboot项目全局异常处理那些事儿
基础教程推荐
- MongoDB数据库安装部署及警告优化 2023-07-15
- 一文带你将csv文件导入到mysql数据库(亲测有效) 2022-08-31
- redis++的编译 安装 使用方案 2023-07-13
- redis删除hash的实现方式 2023-07-12
- 基于Python制作一个简单的文章搜索工具 2023-07-28
- 基于redis分布式锁实现“秒杀” 2023-09-11
- 亲手教你SQLyog12.08安装详细教程 2023-07-26
- 什么时候使用redis?什么时候使用memcache? 2023-09-12
- redis中5种数据基础查询命令 2023-07-13
- centos安装redis 2023-09-12