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  dm 
 | 
 * @since 2025/03/31 16:44 
 | 
 */ 
 | 
@Slf4j 
 | 
@ApiModel("响应对象") 
 | 
@Data 
 | 
@AllArgsConstructor 
 | 
public class ApiResponse<T> 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 <T> ApiResponse<T> success(T data) { 
 | 
        return ApiResponse.success("请求成功", data); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 请求成功 
 | 
     * 
 | 
     * @param message 消息 
 | 
     * @param data 数据 
 | 
     * @return ApiResponse 
 | 
     */ 
 | 
    public static <T> ApiResponse<T> success(String message, T data) { 
 | 
        return new ApiResponse<>(HttpStatus.OK.value(), Boolean.TRUE, message, data, null); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 请求失败 
 | 
     * 
 | 
     * @param message 消息 
 | 
     * @return ApiResponse 
 | 
     */ 
 | 
    public static <T> ApiResponse<T> failed(String message) { 
 | 
        return ApiResponse.failed(HttpStatus.INTERNAL_SERVER_ERROR.value(), message); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 请求失败 
 | 
     * 
 | 
     * @param status 响应状态 
 | 
     * @return ApiResponse 
 | 
     */ 
 | 
    public static <T> ApiResponse<T> failed(ResponseStatus status) { 
 | 
        return ApiResponse.failed(status.getCode(), status.getMessage()); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 请求失败 
 | 
     * 
 | 
     * @param status 响应状态 
 | 
     * @param ex 异常对象 
 | 
     * @return ApiResponse 
 | 
     */ 
 | 
    public static <T> ApiResponse<T> failed(ResponseStatus status, Throwable ex) { 
 | 
        return ApiResponse.failed(status.getCode(), status.getMessage(), ex); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 请求失败 
 | 
     * 
 | 
     * @param code 响应码 
 | 
     * @param message 消息 
 | 
     * @return ApiResponse 
 | 
     */ 
 | 
    public static <T> ApiResponse<T> failed(Integer code, String message) { 
 | 
        return ApiResponse.failed(code, message, null); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 请求失败 
 | 
     * 
 | 
     * @param code 响应码 
 | 
     * @param message 消息 
 | 
     * @param ex 异常 
 | 
     * @return ApiResponse 
 | 
     */ 
 | 
    public static <T> ApiResponse<T> 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); 
 | 
        } 
 | 
    } 
 | 
} 
 |