spring boot 統一結果集處理(使用註解和aop)

1.創建Result工具類

1.1 首先你可以創建枚舉類型用來標記狀態

public enum StatusTypeEnum {
    /**
     * 200爲成功
     * 404爲錯誤信息
     */
    SUCCESS(200, "success"),
    ERROR(404, "error");

    private String msg;
    private int status;

    public String getMsg() {
        return msg;
    }

    public int getStatus() {
        return status;
    }

    StatusTypeEnum(int status, String msg) {
        this.status = status;
        this.msg = msg;
    }

}

1.2 之後創建一個Result 接口

這裏你可以什麼都不寫,方便以後擴展

public interface Result<T> {

}

1.3 創建SuccessResult和 ErrorResult 實現接口Result

可以使用Lombok生產set get 和 無參構造 和有參構造

SuccessResult

@Data
@AllArgsConstructor
@NoArgsConstructor
public class SuccessResult<T> implements Result<T> {
    private StatusTypeEnum type;
    private int status;
    private T data;
    private String requestTime;

    public static SuccessResult succes() {
        return new SuccessResult<>(StatusTypeEnum.SUCCESS, StatusTypeEnum.SUCCESS.getStatus(), null, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
    }

    public static <T> SuccessResult succes(T data) {
        return new SuccessResult<>(StatusTypeEnum.SUCCESS, StatusTypeEnum.SUCCESS.getStatus(), data, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
    }
}

ErrorResult

@Data
@NoArgsConstructor
@AllArgsConstructor
public class ErrorResult implements Result {
    private int status;
    private StatusTypeEnum type;
    private String msg;
    private String requestTime;


    public static ErrorResult error(int status, Exception ex) {
        return new ErrorResult(StatusTypeEnum.ERROR.getStatus(), StatusTypeEnum.ERROR, ex.getMessage(), new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
    }

    public static ErrorResult error() {
        return new ErrorResult(StatusTypeEnum.ERROR.getStatus(), StatusTypeEnum.ERROR, null, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
    }

    public static ErrorResult error(String mag) {
        return new ErrorResult(StatusTypeEnum.ERROR.getStatus(), StatusTypeEnum.ERROR, mag, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
    }
}

2. 創建Result註解

package com.vip.webordertwo.utils.handler;

import org.springframework.web.bind.annotation.Mapping;

import java.lang.annotation.*;

/**
 * @author Tang
 */
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD,ElementType.TYPE})
@Mapping
@Documented
public @interface ResultParameter {
    boolean isResult() default true;
}


3.結果統一處理,進行攔截

package com.vip.webordertwo.utils.handler;

import com.vip.webordertwo.utils.common.ErrorResult;
import com.vip.webordertwo.utils.common.SuccessResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;

/**
 * 返回統一的結果  RestControllerAdvice
 * ResponseBodyAdvice 接口
 * @author zhangwei
 */
@RestControllerAdvice
@Slf4j
public class GlobalResultAdvice  implements ResponseBodyAdvice {
    @Override
    public boolean supports(MethodParameter returnType, Class converterType) {

        return returnType.getMethod().isAnnotationPresent(ResultParameter.class);

    }

    /**
     *
     * @param body
     * @param returnType
     * @param selectedContentType
     * @param selectedConverterType
     * @param request
     * @param response
     * @return
     */
    @Override
    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {

        Object resp = null;
        if (body instanceof ErrorResult){
            resp = body;
        }else{
            resp =  SuccessResult.succes(body);
            if((int) body == 0){
                resp = ErrorResult.error();
            }else {
                resp = SuccessResult.succes(body);
            }
        }

        return resp;
    }
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章