统一异常响应结构通过定义Result类、枚举错误码、自定义异常和@ControllerAdvice全局处理,实现API返回一致性。1. 创建Result<T>封装返回数据;2. 定义ErrorCode枚举管理错误码;3. 设计BusinessException携带错误信息;4. 使用@ControllerAdvice统一拦截异常并转换为Result格式;5. 控制器中抛出异常自动返回标准化错误。该方案提升前后端协作效率,隐藏敏感信息,增强可维护性。

在Java开发中,特别是基于Spring Boot的Web项目里,设计统一的异常响应结构能提升API的可读性和前后端协作效率。当系统发生异常时,返回结构清晰、字段一致的错误信息,有助于前端快速定位问题。
首先创建一个通用的响应类,用于封装所有接口的返回数据,包括正常结果和异常情况。
示例:Result 类
public class Result<T> {
private int code;
private String message;
private T data;
public static <T> Result<T> success(T data) {
Result<T> result = new Result<>();
result.code = 200;
result.message = "success";
result.data = data;
return result;
}
public static <T> Result<T> error(int code, String message) {
Result<T> result = new Result<>();
result.code = code;
result.message = message;
return result;
}
// getter 和 setter 省略
}
通过枚举管理常见错误码,避免硬编码,增强可维护性。
立即学习“Java免费学习笔记(深入)”;
public enum ErrorCode {
SYSTEM_ERROR(500, "系统内部错误"),
RESOURCE_NOT_FOUND(404, "资源未找到"),
INVALID_PARAM(400, "参数无效");
private final int code;
private final String message;
ErrorCode(int code, String message) {
this.code = code;
this.message = message;
}
public int getCode() { return code; }
public String getMessage() { return message; }
}
同时可以设计一个自定义异常类,携带错误码和动态消息:
public class BusinessException extends RuntimeException {
private final int code;
public BusinessException(ErrorCode errorCode, String message) {
super(message);
this.code = errorCode.getCode();
}
public int getCode() { return code; }
}
通过 @ControllerAdvice 拦截所有控制器抛出的异常,统一转换为Result格式返回。
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(BusinessException.class)
@ResponseBody
public Result<Object> handleBusinessException(BusinessException e) {
return Result.error(e.getCode(), e.getMessage());
}
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseBody
public Result<Object> handleValidationException(MethodArgumentNotValidException e) {
List<String> errors = e.getBindingResult()
.getFieldErrors()
.stream()
.map(FieldError::getDefaultMessage)
.collect(Collectors.toList());
return Result.error(400, errors.toString());
}
@ExceptionHandler(Exception.class)
@ResponseBody
public Result<Object> handleUnexpectedException(Exception e) {
// 生产环境建议不暴露堆栈信息
return Result.error(500, "服务器繁忙,请稍后再试");
}
}
正常返回和异常抛出都保持一致性:
@RestController
public class UserController {
@GetMapping("/user/{id}")
public Result<User> getUser(@PathVariable Long id) {
if (id <= 0) {
throw new BusinessException(ErrorCode.INVALID_PARAM, "ID必须大于0");
}
User user = userService.findById(id);
if (user == null) {
throw new BusinessException(ErrorCode.RESOURCE_NOT_FOUND, "用户不存在");
}
return Result.success(user);
}
}
基本上就这些。统一异常响应的核心在于:规范返回结构、集中异常处理、区分异常类型、对外隐藏敏感信息。这样既能保证接口一致性,也便于后期扩展和维护。
以上就是Java中如何设计统一的异常响应结构的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号