All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.guanmengyuan.spring.ex.common.model.dto.res.Res Maven / Gradle / Ivy

The newest version!
package com.guanmengyuan.spring.ex.common.model.dto.res;

import cn.dev33.satoken.exception.NotLoginException;
import cn.dev33.satoken.exception.SaTokenException;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.guanmengyuan.spring.ex.common.model.enums.ResEnum;
import com.guanmengyuan.spring.ex.common.model.exception.ServiceException;
import lombok.Data;
import org.dromara.hutool.core.collection.CollUtil;
import org.dromara.hutool.core.text.StrUtil;
import org.springframework.http.HttpStatus;
import org.springframework.http.HttpStatusCode;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.support.WebExchangeBindException;
import org.springframework.web.server.ResponseStatusException;
import org.springframework.web.server.ServerWebExchange;

import java.io.Serializable;
import java.util.List;
import java.util.Objects;

/**
 * 统一响应dto
 *
 * @param  任意类型
 */
@Data
public class Res implements Serializable {
    /**
     * 是否成功
* true 操作成功
* false 操作失败 */ private Boolean success; /** * 响应消息 */ @JsonIgnore private String message; /** * 响应数据,所有的数据响应都会在外层包装此类型 */ private T result; /** * 用户提示 */ private String tips; /** * 请求ID */ @JsonInclude(JsonInclude.Include.NON_NULL) private String traceId; /** * http code */ @JsonIgnore private HttpStatusCode httpStatusCode; /** * 正常响应无数据 * * @param traceId 请求ID * @return 无数据的正常响应 */ public static Res successNoData(String traceId) { Res res = successNoData(); res.setTraceId(traceId); return res; } /** * 正常响应无数据 * * @return 无数据的响应 */ public static Res successNoData() { Res res = new Res<>(); res.setSuccess(Boolean.TRUE); setResEnum(res, ResEnum.SUCCESS); return res; } /** * 错误响应 * * @param error 错误接口 * @param exchange exchange实例 * @return 错误响应 */ public static Res error(Throwable error, ServerWebExchange exchange) { Res res = new Res<>(); res.setSuccess(Boolean.FALSE); res.setTraceId(exchange.getRequest().getId()); res.setMessage(StrUtil.format("request path error,path:{},errorMessage:{}", exchange.getRequest().getPath(), error.getMessage())); res.setTips(ResEnum.INTERNAL_SERVER_ERROR.getTips()); if (error instanceof ResponseStatusException responseStatusException) { setRes(error, responseStatusException, res); } else { res.setHttpStatusCode(HttpStatus.INTERNAL_SERVER_ERROR); } return res; } private static void setRes(Throwable error, ResponseStatusException responseStatusException, Res res) { HttpStatusCode statusCode = responseStatusException.getStatusCode(); res.setHttpStatusCode(statusCode); if (error instanceof ServiceException serviceException) { res.setTips(serviceException.getTips()); } else if (error instanceof WebExchangeBindException webExchangeBindException) { List allErrors = webExchangeBindException.getAllErrors(); if (CollUtil.isNotEmpty(allErrors)) { res.setTips(StrUtil.defaultIfBlank(allErrors.get(0).getDefaultMessage(), ResEnum.INTERNAL_SERVER_ERROR.getTips())); } } } /** * 错误响应 * * @param serviceException 业务异常 * @return 错误响应 */ public static Res error(ServiceException serviceException) { Res res = new Res<>(); res.setMessage(serviceException.getMessage()); res.setTips(serviceException.getTips()); res.setHttpStatusCode(serviceException.getStatusCode()); res.setSuccess(Boolean.FALSE); return res; } /** * 错误响应 * * @param throwable 异常接口 * @return 错误响应 */ public static Res error(Throwable throwable) { Res res = new Res<>(); // 如果是内置业务异常 if (throwable instanceof ServiceException serviceException) { res.setMessage(serviceException.getMessage()); res.setTips(serviceException.getTips()); res.setHttpStatusCode(serviceException.getStatusCode()); // 如果是参数校验异常 } else if (throwable instanceof MethodArgumentNotValidException methodArgumentNotValidException) { res.setTips(Objects.requireNonNull(methodArgumentNotValidException.getBindingResult().getFieldError()) .getDefaultMessage()); res.setHttpStatusCode(HttpStatus.BAD_REQUEST); res.setMessage(throwable.getMessage()); // 其他异常 } else if (throwable instanceof SaTokenException saTokenException) { if (saTokenException instanceof NotLoginException) { res.setTips(ResEnum.NOT_LOGIN.getTips()); } else { res.setTips(ResEnum.UNAUTHORIZED.getTips()); } res.setHttpStatusCode(ResEnum.UNAUTHORIZED.getHttpStatusCode()); res.setMessage(saTokenException.getMessage()); } else { res.setTips(ResEnum.INTERNAL_SERVER_ERROR.getTips()); res.setHttpStatusCode(ResEnum.INTERNAL_SERVER_ERROR.getHttpStatusCode()); res.setMessage(throwable.getMessage()); } res.setSuccess(Boolean.FALSE); return res; } /** * setRes * * @param res res * @param resEnum 响应枚举 */ private static void setResEnum(Res res, ResEnum resEnum) { res.setMessage(resEnum.getMessage()); res.setTips(resEnum.getTips()); res.setHttpStatusCode(res.httpStatusCode); } /** * 成功响应 * * @param result 数据 * @param traceId 请求ID * @param 泛型类型 * @return 响应结果 */ public static Res success(T result, String traceId) { Res res = success(result); res.setTraceId(traceId); return res; } /** * 成功响应 * * @param result 数据 * @param 数据类型 * @return 成功的响应 */ public static Res success(T result) { Res res = new Res<>(); res.setResult(result); res.setSuccess(Boolean.TRUE); setResEnum(res, ResEnum.SUCCESS); return res; } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy