Spring REST 异常处理之全局处理
程序员文章站
2022-05-22 09:38:25
...
承接上一篇文章,本文介绍在REST系统中,我们怎样对异常信息做全局处理。这种方式也是我个人使用最多的方式。
-
首先,我们看一下spring framework官方文档关于这一点的介绍
可以看到,文档讲的非常简单。对于初学者,可能直接就忽略了。但是,结合博主的其他几篇文章(文末有链接),我们还是可以搞清楚它讲的是什么的。从它的介绍可以看出,使用该种方式,我们可以方便地定义异常消息的内容、自定义异常响应体,可以说灵活性非常好。另外,通过继承ResponseEntityExceptionHandler这个类并覆盖其中的方法,我们甚至可以处理spring MVC的标准(内置)异常;除此之外,我们还可以进行扩展,处理我们自定义的异常。
- 示例代码
@RestControllerAdvice(annotations = RestController.class)
public class RestExceptionHandler extends ResponseEntityExceptionHandler {
private static Logger logger = LoggerFactory.getLogger(RestExceptionHandler.class);
/**
* 非法访问
*
* @param ex 非法访问的异常对象
* @return 响应体
*/
@ExceptionHandler(InvalidPermissionException.class)
public ResponseEntity<ApiResponse<Void>> handleInvalidPermissionException(
InvalidPermissionException ex) {
logger.error("操作失败:{}", ex.getMessage());
// API返回结果
ApiResponse<Void> apiResponse = new ApiResponse<>(
ApiResponseCode.CODE_INVALID_PERMISSION.getCode(), ex.getMessage());
return new ResponseEntity<>(apiResponse, HttpStatus.BAD_REQUEST);
}
/**
* 重复操作
*
* @param ex 重复操作的异常对象
* @return 响应体
*/
@ExceptionHandler(DuplicatedOperationException.class)
public ResponseEntity<ApiResponse<Void>> handleDuplicatedOperationException(
DuplicatedOperationException ex) {
logger.error("操作失败:{}", ex.getMessage());
// API返回结果
ApiResponse<Void> apiResponse = new ApiResponse<>(
ApiResponseCode.CODE_DUPLICATED_OPERATION.getCode(), ex.getMessage());
return new ResponseEntity<>(apiResponse, HttpStatus.BAD_REQUEST);
}
/**
* 其他异常都按照"未知异常"处理
*
* @param e 异常对象
* @return 响应体
*/
@ExceptionHandler(Exception.class)
public ResponseEntity<ApiResponse<Void>> otherException(Exception e) {
logger.error("操作失败:{}", e);
ApiResponseCode apiResponseCode = ApiResponseCode.CODE_UNKNOWN;
// API 返回结果
ApiResponse<Void> apiResponse = new ApiResponse<>(apiResponseCode);
return new ResponseEntity<>(apiResponse, HttpStatus.BAD_REQUEST);
}
}
在上面的例子中,我们实现了自定义异常的处理,通过@ExceptionHandler(结合@RestControllerAdvice)我们捕获自定义的异常(例子中的InvalidPermissionException和DuplicatedOperationException),然后在各自的异常处理方法中进行处理。当然,这个例子只是对我们自定义的异常进行捕获,然后设置错误码、设置消息提示,异常处理逻辑并不复杂。在实际应用中,我们可以根据需求实现更复杂的异常处理逻辑。
上一篇: PHP中使用array函数新建一个数组
下一篇: 13式减肥瑜伽教程 排清毒素养颜消脂