0
点赞
收藏
分享

微信扫一扫

九 . spring-boo规范之restful 封装

梦想家们 2021-09-21 阅读 54

概述

步骤一 : Response响应结果工具类

1. 定义基础接口:BaseResponseEntity

public interface BaseResponseEntity<T> {}

2. 定义状态信息enum类

public enum ResponseStatus {
    /* 成功状态码 10000 */
    SUCCESS(200, "成功"),
    /* 账号错误*/

    /*用户未登录*/
    ACCOUNT_NOT_LOGIN(10001, "user no login"),
    /*账号不存在或密码错误*/
    ACCOUNT_LOGIN_ERROR(10002, "user login error"),
    /*账号已存在*/
    ACCOUNT_IS_EXISTENT(10003, "account is existent"),
    /*账号不存在*/
    ACCOUNT_NOT_EXIST(10004, "account not exist"),
    /*账号已禁止  请与管理员联系*/
    USER_ACCOUNT_LOCKED(10005, "user account locked"),

    /* 参数错误*/
    /*参数不为空*/
    PARAMS_NOT_IS_BLANK(20001, "params not is blank"),
    /*参数无效*/
    PARAMS_IS_INVALID(20002, "params is invalid"),
    /*参数类型错误*/
    PARAM_TYPE_ERROR(20003, "param type error"),
    /*参数缺失*/
    PARAM_IS_DEFICIENCY(20004, "param is deficiency"),
    /*暂无权限*/
    PERMISSION_NO_ACCESS(20006, "no permissions access"),
    AUTH_ERROR(20007, "auth error"),
    /* 业务错误 */

    /* 业务繁忙 请稍后在试 */
    BUSINESS_UNKNOW_ERROR(30001, " busy with business"),

    /*内部调用服务不可用*/
    GW_UNKNOW_ERROR(30002, "unknow error"),

    /* ======系统错误:40001-49999===== */
    /* 提示语 "系统繁忙,请稍后重试"*/
    SYSTEM_INNER_ERROR(40001, "system error"),
    /*未知错误 请稍后在试*/
    SYSTEM_UNKNOW_ERROR(40002, "system unknow error"),
    /*内部系统接口调用异常*/
    INNER_INVOKE_ERROR(50001, "inner invoke error"),
    /*外部系统接口调用异常*/
    OUTER_INVOKE_ERROR(50002, "outer invoke error"),
    /*该接口禁止访问*/
    NO_ACCESS_FORBIDDEN(50003, "no access forbidden"),
    /*接口地址无效*/
    NO_FOUND_ERROR(50004, "no found error"),
    /* 数据错误 */
    DATA_IS_WRONG(60001, "DATA_IS_WRONG");

    private Integer status;

    private String msg;

    ResponseStatus(Integer status, String message) {
        this.status = status;
        this.msg = message;
    }

    public Integer getStatus() {
        return status;
    }

    public String getMsg() {
        return msg;
    }

    public void setStatus(Integer status) {
        this.status = status;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }
}

3. ResponseEntity类(success)

@Builder
@Data
public class ResponseEntity<Object> implements BaseResponseEntity {
    private Integer status;

    private String msg;

    private Object data;

    private ResponseEntity(ResponseStatus responseStatus, Object data) {
        this.msg = responseStatus.getMsg();
        this.status = responseStatus.getStatus();
        this.data = data;
    }


    public static ResponseEntity success() {
        return ResponseEntity
                .builder()
                .status(ResponseStatus.SUCCESS.getStatus())
                .msg(ResponseStatus.SUCCESS.getMsg())
                .build();
    }

    public static <T> ResponseEntity success(T data) {
        return ResponseEntity
                .builder()
                .data(data)
                .status(ResponseStatus.SUCCESS.getStatus())
                .msg(ResponseStatus.SUCCESS.getMsg())
                .build();
    }

    public static <T> ResponseEntity success(ResponseStatus responseStatus, T data) {
        return ResponseEntity
                .builder()
                .data(data)
                .status(responseStatus.getStatus())
                .msg(responseStatus.getMsg())
                .build();
    }

    /**
     * @param status
     * @param msg
     * @param data
     * @param <T>
     * @return
     */
    public static <T> ResponseEntity success(int status, String msg, T data) {
        return ResponseEntity
                .builder()
                .data(data)
                .status(status)
                .msg(msg)
                .build();
    }

    /*=============错误信息处理=================*/

    /**
     * 框架自带的状态码 org.springframework.http.HttpStatus
     *
     * @param
     * @return
     */

    public static ResponseEntity error() {
        return ResponseEntity.builder()
                .status(HttpStatus.INTERNAL_SERVER_ERROR.value())
                .msg(HttpStatus.INTERNAL_SERVER_ERROR.getReasonPhrase())
                .build();
    }


    public static ResponseEntity error(String message) {
        return ResponseEntity
                .builder()
                .msg(message)
                .build();
    }

    public static ResponseEntity error(int status) {
        return ResponseEntity
                .builder()
                .status(status)
                .build();
    }

    public static ResponseEntity error(int status, String message) {
        return ResponseEntity
                .builder()
                .msg(message)
                .status(status)
                .build();
    }


    public static ResponseEntity error(ResponseStatus responseStatus) {
        return ResponseEntity.builder()
                .status(responseStatus.getStatus())
                .msg(responseStatus.getMsg())
                .build();
    }

    public static <T> ResponseEntity error(ResponseStatus responseStatus, T data) {
        return ResponseEntity.builder()
                .status(responseStatus.getStatus())
                .msg(responseStatus.getMsg())
                .data(data)
                .build();
    }
}

4. ErrorResponseEntity类(error)

@Data
@Builder
public class ErrorResponseEntity implements BaseResponseEntity {
    /**
     * HTTP响应状态码 {@link org.springframework.http.HttpStatus}
     */
    private Integer status;

    /**
     * 前端显示的信息
     */
    private String msg;
    /**
     * 错误的信息
     */
    private String error;
    /**
     * 异常的名字
     */
    private String exception;

    private String path;

    /**
     * 时间戳
     */
    private Date timestamp;


    public static ErrorResponseEntity failure(ResponseStatus responseStatus, Throwable e) {
        return ErrorResponseEntity.builder()
                .msg(responseStatus.getMsg())
                .status(responseStatus.getStatus())
                .error(e.getMessage())
                .timestamp(new Date())
                .exception(e.getClass().getName())
                .build();
    }

}

5. 全局异常处理类(示例)

@RestControllerAdvice
@Slf4j
public class ExceptionHandlerAdvice {
    /**
     * 处理未捕获的Exception
     * @param e 异常
     * @return 统一响应体
     */
    @ExceptionHandler(Exception.class)
    public BaseResponseEntity handleException(Exception e) {
        if (e instanceof ServiceException) {
            return ResponseEntity.error(ResponseStatus.BUSINESS_UNKNOW_ERROR);
        } else if (e instanceof NoHandlerFoundException) {
            return ResponseEntity.error(ResponseStatus.NO_FOUND_ERROR);
        } else {
            return ResponseEntity.error(ResponseStatus.SYSTEM_UNKNOW_ERROR);
        }
    }
}

6. 全局结果处理

@RestControllerAdvice
public class GlobalResultAdvice implements ResponseBodyAdvice {
    @Override
    public boolean supports(MethodParameter returnType, Class converterType) {
        //如果返回false,将不会执行beforeBodyWrite方法
        return true;
    }

    @Override
    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
        if(body instanceof SuccessResult || body instanceof ErrorResult){
            return body;
        }else {
            return SuccessResult.success(body);
        }
    }
}
举报

相关推荐

0 条评论