下面我将为您详细讲解“SpringBoot统一接口返回及全局异常处理高级用法”的完整攻略。
1. 概述
在SpringBoot应用中,我们有时需要对接口的返回结果进行统一处理,并且需要对系统异常进行全局处理。为了达到这个目的,我们可以使用SpringBoot提供的@ControllerAdvice
和@ExceptionHandler
注解来实现统一接口返回及全局异常处理的功能。
2. 统一接口返回
2.1 定义返回结果封装类
首先我们需要定义一个返回结果封装类,可以统一对接口的返回结果进行封装。
@Data
public class Result<T> {
/**
* 响应状态码
*/
private int code;
/**
* 响应提示信息
*/
private String message;
/**
* 响应数据
*/
private T data;
public Result(int code, String message) {
this(code, message, null);
}
public Result(int code, String message, T data) {
this.code = code;
this.message = message;
this.data = data;
}
}
2.2 定义返回结果处理类
接下来,我们需要定义一个返回结果处理类,用来进行接口返回结果的统一封装。
@ControllerAdvice
public class ResultHandler {
/**
* 成功时返回的结果
*/
private static final int SUCCESS_CODE = 200;
/**
* 失败时返回的结果
*/
private static final int ERROR_CODE = 500;
/**
* 统一处理接口返回值
*/
@ResponseBody
@ExceptionHandler(Exception.class)
public Result<Object> handleException(Exception e) {
e.printStackTrace();
return new Result<>(ERROR_CODE, e.getMessage());
}
@ResponseBody
@RequestMapping(produces = "application/json;charset=UTF-8")
public Result<?> handleControllerException(HttpServletRequest request, Throwable ex) {
if (ex instanceof BindException || ex instanceof MethodArgumentNotValidException) {
return new Result<>(ErrorCode.REQUEST_PARAM_ERROR.getCode(), ex.getMessage());
} else if (ex instanceof IllegalArgumentException) {
return new Result<>(ErrorCode.REQUEST_PARAM_ERROR.getCode(), ex.getMessage());
} else {
ex.printStackTrace();
}
return new Result<>(ErrorCode.SERVER_ERROR.getCode(), ErrorMessage.INTERNAL_SERVER_ERROR);
}
/**
* 成功时返回的结果
*
* @param data 返回的数据
*/
public static <T> Result<T> success(T data) {
return new Result<>(SUCCESS_CODE, "成功", data);
}
/**
* 失败时返回的结果
*
* @param message 提示信息
*/
public static Result<?> error(String message) {
return new Result<>(ERROR_CODE, message);
}
/**
* 失败时返回的结果
*
* @param code 错误码
* @param message 提示信息
*/
public static Result<?> error(int code, String message) {
return new Result<>(code, message);
}
}
2.3 使用返回结果处理类
使用返回结果处理类的方法非常简单,只需要在控制器中进行调用即可。
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
/**
* 查询所有用户
*/
@GetMapping("/list")
public Result<List<User>> getUsers() {
List<User> userList = userService.getAllUsers();
return ResultHandler.success(userList);
}
}
3. 全局异常处理
3.1 定义异常处理类
接下来我们需要定义一个全局异常处理类,用来统一处理系统异常。
@ControllerAdvice
public class ExceptionHandler {
/**
* 处理自定义异常
*/
@ResponseBody
@ExceptionHandler(BusinessException.class)
public Result<String> handleBusinessException(BusinessException e) {
return new Result<>(e.getCode(), e.getMessage());
}
/**
* 处理其他异常
*/
@ResponseBody
@ExceptionHandler(Exception.class)
public Result<String> handleException(Exception e) {
e.printStackTrace();
return new Result<>(500, "系统错误,请稍后重试");
}
}
3.2 定义业务异常类
我们需要定义一个自定义业务异常类,用来统一处理业务异常。
public class BusinessException extends RuntimeException {
/**
* 错误码
*/
private int code;
/**
* 错误提示信息
*/
private String message;
public BusinessException(int code, String message) {
this.code = code;
this.message = message;
}
public int getCode() {
return code;
}
public String getMessage() {
return message;
}
}
3.3 使用全局异常处理
使用全局异常处理的方法非常简单,只需要在代码中抛出异常即可。
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
/**
* 查询所有用户
*/
@GetMapping("/list")
public Result<List<User>> getUsers() {
List<User> userList = userService.getAllUsers();
return ResultHandler.success(userList);
}
/**
* 根据用户ID查询用户
*/
@GetMapping("/{userId}")
public Result<User> getUserById(@PathVariable("userId") Integer userId) {
User user = userService.getUserById(userId);
if (user == null) {
throw new BusinessException(ErrorCode.USER_NOT_FOUND.getCode(), "用户不存在");
}
return ResultHandler.success(user);
}
}
以上就是“SpringBoot统一接口返回及全局异常处理高级用法”的完整攻略。如果您有更多问题,欢迎在评论区向我提问。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot统一接口返回及全局异常处理高级用法 - Python技术站