Spring 4.1 設置接口返回統一數據類型

1.首先了解下面
ResponseBodyAdvice

這個類的作用,和@ControllerAdvice的作用。@ControllerAdvice是使得該註解的類能在所有@controller的Mapping接口調用是調用該方法

package com.why.greenhouse.front.config.advice;

import com.why.greenhouse.front.config.advice.model.Response;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;

/**
 * @author why
 */

@ControllerAdvice
public class ResponseAdvice implements ResponseBodyAdvice {
    /**
     * 此組件是否支持給定的控制器方法返回類型,這裏是json
     * @param returnType 返回json類型
     * @param converterType 報文轉換爲指定
     * @return 指定類型
     */
    @Override
    public boolean supports(MethodParameter returnType, Class converterType) {
        return converterType.equals(MappingJackson2HttpMessageConverter.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) {
        String requestPath = request.getURI().getPath();
        if (requestPath.contains("/swagger") || requestPath.contains("/v2/api-docs")) {
            return body;
        }
        Response res;
        if (body instanceof Response){
           return body;
        }else {
            res = new Response<>(body);
        }
        return res;
    }
}

具體的結果體實體類如下:

package com.why.greenhouse.front.config.advice.model;

/**
 * @author why
 * 系統設置統一數據結構
 * @param <T>
 */
public class Response<T> {
    private String code;
    private String message;
    private String detailMessage;
    private T data;

    public Response() {

    }
    public Response(ErrorCode errorCode) {
        this.code = errorCode.getCode();
        this.message = errorCode.getMsg();
        this.detailMessage = null;
        this.data = null;
    }

    public Response(ErrorCode errorCode, String detailMessage) {
        this(errorCode);
        this.detailMessage = detailMessage;
    }
    public Response(T data) {
        this(CommonErrorCode.SUCCESS);
        this.data = data;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public String getDetailMessage() {
        return detailMessage;
    }

    public void setDetailMessage(String detailMessage) {
        this.detailMessage = detailMessage;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }
}

錯誤接口定義如下:

package com.why.greenhouse.front.config.advice.model;

/**
 * @author why
 */
public interface ErrorCode {
    /**
     * 獲取返回碼
     * @return
     */
    String getCode();

    /**
     * 獲取返回消息
     * @return
     */
    String getMsg();
}

具體實現如下:

package com.why.greenhouse.front.config.advice.model;

public enum  CommonErrorCode implements ErrorCode{
    /**
     * 成功情況下的統一返回值
     */
    SUCCESS("0000","成功"),
    FAILED("9999","失敗"),
    ;

    private String code;
    private String msg;

    CommonErrorCode(String code, String msg) {
        this.code = code;
        this.msg = msg;
    }
    @Override
    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    @Override
    public String getMsg() {
        return msg;
    }

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

可以自己定義具體的錯誤類型。這個時候調用接口的時候就會出現下面的返回結構體。如有沒有成功的可以聯繫本人,大家一起探討。






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