package com.doumee.core.model; import com.alibaba.fastjson.JSON; import com.doumee.core.constants.ResponseStatus; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.AllArgsConstructor; import lombok.Data; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.Serializable; import java.nio.charset.StandardCharsets; /** * 接口返回对象 * @author Eva.Caesar Liu * @since 2025/03/31 16:44 */ @Slf4j @ApiModel("响应对象") @Data @AllArgsConstructor public class ApiResponse implements Serializable { @ApiModelProperty(value = "响应码") private int code; @ApiModelProperty(value = "请求是否成功") private boolean success; @ApiModelProperty(value = "错误消息") private String message; @ApiModelProperty(value = "数据") private T data; @ApiModelProperty(value = "异常消息") private String exception; public ApiResponse () {} /** * 请求成功 * * @param data 数据 * @return ApiResponse */ public static ApiResponse success(T data) { return ApiResponse.success("请求成功", data); } /** * 请求成功 * * @param message 消息 * @param data 数据 * @return ApiResponse */ public static ApiResponse success(String message, T data) { return new ApiResponse<>(HttpStatus.OK.value(), Boolean.TRUE, message, data, null); } /** * 请求失败 * * @param message 消息 * @return ApiResponse */ public static ApiResponse failed(String message) { return ApiResponse.failed(HttpStatus.INTERNAL_SERVER_ERROR.value(), message); } /** * 请求失败 * * @param status 响应状态 * @return ApiResponse */ public static ApiResponse failed(ResponseStatus status) { return ApiResponse.failed(status.getCode(), status.getMessage()); } /** * 请求失败 * * @param status 响应状态 * @param ex 异常对象 * @return ApiResponse */ public static ApiResponse failed(ResponseStatus status, Throwable ex) { return ApiResponse.failed(status.getCode(), status.getMessage(), ex); } /** * 请求失败 * * @param code 响应码 * @param message 消息 * @return ApiResponse */ public static ApiResponse failed(Integer code, String message) { return ApiResponse.failed(code, message, null); } /** * 请求失败 * * @param code 响应码 * @param message 消息 * @param ex 异常 * @return ApiResponse */ public static ApiResponse failed(Integer code, String message, Throwable ex) { if (ex == null) { return new ApiResponse<>(code, Boolean.FALSE, message, null, null); } // 处理异常栈,防止过多内容导致响应内容过大 StackTraceElement[] trace = ex.getStackTrace(); StringBuilder exceptionStack = new StringBuilder(ex + "\n"); for (StackTraceElement traceElement : trace) { exceptionStack.append("\tat ").append(traceElement).append("\n"); if (exceptionStack.length() > 5000) { break; } } return new ApiResponse<>(code, Boolean.FALSE, message, null, exceptionStack.toString()); } /** * 直接通过HttpServletResponse写出响应结果 * * @param response 响应 * @param apiResponse ApiResponse */ public static void response (HttpServletResponse response, ApiResponse apiResponse) { try { response.setHeader("content-type", "application/json;charset=UTF-8"); response.getOutputStream().write(JSON.toJSONString(apiResponse).getBytes(StandardCharsets.UTF_8)); } catch (IOException e) { log.error("EVA: response throw an exception", e); } } }