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;
    }
}

可以自己定义具体的错误类型。这个时候调用接口的时候就会出现下面的返回结构体。如有没有成功的可以联系本人,大家一起探讨。






猜你喜欢

转载自blog.csdn.net/why154285/article/details/80976385