在spring boot中,通过定义一个通用的响应包装类并结合全局异常处理器或拦截器,可以实现rest接口返回统一格式。具体做法是创建一个包含状态码、消息和数据字段的泛型类,并在controller层直接返回该类的实例,同时在配置类中注册全局异常处理逻辑,确保任何未捕获的异常也能转换为相同的json结构。

如何定义统一的响应数据结构
统一响应结构的核心是一个泛型类,它通常包含三个主要字段:表示操作是否成功的布尔值或状态码、描述结果的字符串信息以及实际的业务数据载体。这种设计允许前端根据状态码快速判断请求结果,并通过数据载体解析具体内容。

package com.example.demo.model;
import lombok.Data;
@Data
public class ApiResponse<T> {
private int code;
private String message;
private T data;
public static <T> ApiResponse<T> success(T data) {
ApiResponse<T> response = new ApiResponse<>();
response.setCode(200);
response.setMessage("Success");
response.setData(data);
return response;
}
public static <T> ApiResponse<T> error(int code, String message) {
ApiResponse<T> response = new ApiResponse<>();
response.setCode(code);
response.setMessage(message);
response.setData(null);
return response;
}
}上述代码定义了ApiResponse类,使用Lombok的@Data注解自动生成Getter和Setter方法。提供了两个静态工厂方法:success用于成功场景,固定状态码为200;error用于失败场景,允许传入自定义的错误码和消息。在实际Controller中,只需调用这些方法即可返回标准JSON。
如何实现全局异常转换
为了让所有未处理的异常都自动转换为统一格式,需要实现@RestControllerAdvice。这个注解定义的类会拦截所有Controller抛出的异常,并将其封装为ApiResponse对象返回给客户端,避免暴露堆栈跟踪信息。

package com.example.demo.config;
import com.example.demo.model.ApiResponse;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice;
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public ApiResponse<String> handleException(Exception e) {
// 记录日志
System.err.println("Error: " + e.getMessage());
return ApiResponse.error(500, "Internal Server Error: " + e.getMessage());
}
@ExceptionHandler(IllegalArgumentException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public ApiResponse<String> handleBadRequest(IllegalArgumentException e) {
return ApiResponse.error(400, e.getMessage());
}
}这段代码展示了GlobalExceptionHandler的实现。它使用了@RestControllerAdvice来声明这是一个全局异常处理器。内部定义了两个处理方法:handleException捕获所有通用异常,返回500错误;handleBadRequest专门处理参数校验失败的异常,返回400错误。每个方法都返回ApiResponse实例,确保了响应格式的一致性。
当业务逻辑抛出特定异常时如何处理
在实际开发中,除了系统级异常,还经常遇到业务级别的异常,例如用户不存在或权限不足。此时可以在GlobalExceptionHandler中添加针对自定义业务异常的处理器,以便返回更精确的业务错误码。
package com.example.demo.exception;
public class UserNotFoundException extends RuntimeException {
public UserNotFoundException(String message) {
super(message);
}
}
// 在 GlobalExceptionHandler 中添加:
@ExceptionHandler(UserNotFoundException.class)
@ResponseStatus(HttpStatus.NOT_FOUND)
public ApiResponse<String> handleUserNotFound(UserNotFoundException e) {
return ApiResponse.error(404, e.getMessage());
}首先定义了一个继承自RuntimeException的UserNotFoundException。然后在GlobalExceptionHandler中增加对应的@ExceptionHandler方法。当Controller中抛出UserNotFoundException时,Spring会自动匹配到这个处理器,并返回包含404状态码和具体错误信息的统一响应。这种方式使得错误处理更加模块化和清晰。


















