Spring Boot 全局异常处理和统一响应对象的处理方式攻略
在 Spring Boot 应用程序中,异常处理是一个非常重要的部分。为了提高异常处理的效率,我们可以采用全局异常处理和统一响应对象的处理方式。在本篇文章中,我们将为大家介绍如何实现这样一个功能。
全局异常处理
通常情况下,我们会为每个 Controller 编写异常处理,这种方式效率非常低。为了提高开发效率,我们可以采用全局异常处理方式。以下是实现全局异常处理的步骤:
步骤1:创建一个异常处理类
创建一个类来处理所有的异常,这个类必须实现 Spring Boot 的 ErrorController
接口。下面是一个示例:
@RestController
public class GlobalExceptionHandler implements ErrorController {
@Override
public String getErrorPath() {
return null;
}
@ExceptionHandler(Exception.class)
public ResponseEntity<Object> handle(Exception ex, WebRequest request) {
if (ex instanceof YourCustomException) {
// 创建自定义异常的响应体
return new ResponseEntity<>(new CustomError("500", ex.getMessage()), HttpStatus.INTERNAL_SERVER_ERROR);
} else {
// 创建系统异常的响应体
return new ResponseEntity<>(new CustomError("500", "系统异常,请稍后再试!"), HttpStatus.INTERNAL_SERVER_ERROR);
}
}
}
ErrorController
接口的 getErrorPath()
方法必须实现,但实际上这个方法返回值不会被使用,所以返回 null 即可。
@ExceptionHandler(Exception.class)
注解表示处理所有异常,我们可以根据不同的异常类型进行不同的处理。在上面的示例中,我们根据是否是自定义异常来返回不同的响应体。
步骤2:定义一个自定义异常
为了方便我们处理自定义异常,我们需要定义一个自定义异常,下面是一个示例:
public class YourCustomException extends RuntimeException {
public YourCustomException(String message) {
super(message);
}
public YourCustomException(String message, Throwable cause) {
super(message, cause);
}
}
通过继承 RuntimeException
类来定义自定义异常。
步骤3:在 Controller 中抛出自定义异常
在需要抛出异常的地方,使用 throw new YourCustomException("抛出自定义异常!");
抛出自定义异常即可。
统一响应对象
为了方便前端和客户端获取统一的响应格式和响应信息,我们需要定义一个统一的响应对象。以下是实现统一响应对象的步骤:
步骤1:定义一个统一的响应对象
public class RestResult<T> {
private String code;
private String msg;
private T data;
public RestResult(String code, String msg) {
this.code = code;
this.msg = msg;
}
public RestResult(String code, String msg, T data) {
this.code = code;
this.msg = msg;
this.data = data;
}
// 省略 getter 和 setter 方法
}
该类中包含三个属性:状态码、消息以及结果数据。
步骤2: 统一返回 RestResult 作为响应体
在 Controller 的返回类型中,我们统一返回 RestResult
对象。以下是一个示例:
@GetMapping("/user/{id}")
public RestResult<User> getUserById(@PathVariable Long id) {
User user = userService.getUserById(id);
return new RestResult<>("200", "操作成功", user);
}
在上面的示例中,RestResult
的泛型类型为 User
,表示响应数据为 User
实体类。
示例1:处理业务异常
下面是一个异常处理的示例,我们将采用上述全局异常处理和统一响应对象的方式。这个示例中,我们将处理一个 “用户不存在”的异常。
步骤1:创建自定义异常
public class UserNotFoundException extends RuntimeException {
public UserNotFoundException() {
super("用户不存在!");
}
}
步骤2:在 Controller 中抛出异常
@GetMapping("/user/{id}")
public RestResult<User> getUserById(@PathVariable Long id) {
User user = userService.getUserById(id);
if (user == null) {
throw new UserNotFoundException();
}
return new RestResult<>("200", "操作成功", user);
}
步骤3:全局异常处理
@RestController
public class GlobalExceptionHandler implements ErrorController {
@Override
public String getErrorPath() {
return null;
}
@ExceptionHandler(Exception.class)
public ResponseEntity<Object> handle(Exception ex, WebRequest request) {
if (ex instanceof UserNotFoundException) {
return new ResponseEntity<>(new RestResult<>("404", ex.getMessage()), HttpStatus.NOT_FOUND);
} else {
return new ResponseEntity<>(new RestResult<>("500", "系统异常,请稍后再试!"), HttpStatus.INTERNAL_SERVER_ERROR);
}
}
}
在上面的示例中,我们定义了一个UserNotFoundException
异常,并在 getUserById
方法中抛出这个异常。当这个异常被抛出时,全局异常处理类会自动捕捉并返回一个统一的响应对象。
示例2:处理系统异常
下面是一个处理系统异常的示例,我们在全局异常处理类中处理所有异常,并返回一个统一的响应格式。
@RestController
public class GlobalExceptionHandler implements ErrorController {
@Override
public String getErrorPath() {
return null;
}
@ExceptionHandler(Exception.class)
public ResponseEntity<Object> handle(Exception ex, WebRequest request) {
return new ResponseEntity<>(new RestResult<>("500", "系统异常,请稍后再试!"), HttpStatus.INTERNAL_SERVER_ERROR);
}
}
在上面的示例中,我们捕获了所有的异常,并返回一个统一的响应对象。这种方式可以极大的提高开发效率,因为我们不需要为每个异常编写异常处理代码。
总结
通过以上几步,我们已经实现了 Spring Boot 全局异常处理和统一响应对象的处理方式。这种方式可以极大的提高开发效率,我们不再需要在每个 Controller 中编写异常处理代码,同时,前后端对接口的异常处理也更加方便和规范。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:springboot 全局异常处理和统一响应对象的处理方式 - Python技术站