Web統一返回值封裝代碼

Web統一返回值封裝代碼

本文是記錄在開發過程中使用的一種統一返回值的封裝代碼,具體代碼如下:

package com.frame.yihao.base.response.util;

import com.alibaba.fastjson.JSON;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.frame.yihao.base.response.enumeration.HttpStatusEnum;
import com.frame.yihao.base.response.enumeration.ResponseMessageEnum;
import com.frame.yihao.base.response.enumeration.SystemStatusEnum;
import com.google.common.collect.Sets;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.io.Serializable;
import java.lang.reflect.Field;
import java.util.*;

/**
 * @Author: darryl
 * @Date: 2019/12/26 13:20
 * 返回值統一封裝
 */
@Data
@ApiModel("系統返回值統一封裝")
public class ResponseMessage<T> implements Serializable {

    /**
     * 異常消息
     */
    @JsonInclude(JsonInclude.Include.NON_NULL)
    @ApiModelProperty("異常消息")
    protected String message;

    /**
     * 業務狀態碼
     */
    @JsonInclude(JsonInclude.Include.NON_NULL)
    @ApiModelProperty("業務狀態碼")
    protected String code;

    /**
     * 響應值
     */
    @JsonInclude(JsonInclude.Include.NON_NULL)
    @ApiModelProperty("響應值")
    protected T result;

    /**
     * 狀態碼
     */
    @JsonInclude(JsonInclude.Include.NON_NULL)
    @ApiModelProperty(value = "狀態碼", required = true)
    protected int status;

    /**
     * 響應內容的字段
     */
    @JsonInclude(JsonInclude.Include.NON_NULL)
    @ApiModelProperty("響應內容的字段")
    protected LinkedHashSet<String> fields;

    /**
     * 時間戳
     */
    @JsonInclude(JsonInclude.Include.NON_NULL)
    @ApiModelProperty(value = "時間戳", required = true, dataType = "Long")
    protected Long timestamp;

    /**
     * 包括
     */
    @JsonInclude(JsonInclude.Include.NON_NULL)
    @ApiModelProperty(hidden = true)
    protected transient Map<Class<?>, Set<String>> includes;

    /**
     * 排除
     */
    @JsonInclude(JsonInclude.Include.NON_NULL)
    @ApiModelProperty(hidden = true)
    protected transient Map<Class<?>, Set<String>> excludes;

    /**
     * 業務邏輯異常
     *
     * @param message
     * @param <T>
     * @return
     */
    public static <T> ResponseMessage<T> serviceException(String message) {
        return error(HttpStatusEnum.OK.getValue(), SystemStatusEnum.UNKNOWN.getCode(), message);
    }

    /**
     * 用戶未登錄
     *
     * @param <T>
     * @return
     */
    public static <T> ResponseMessage<T> unLogin() {
        return error(HttpStatusEnum.OK.getValue(), SystemStatusEnum.NOLOGGING.getCode(), ResponseMessageEnum.USER_UN_LOGIN.getCode());
    }

    /**
     * 無權限,需要消息提示
     *
     * @param message
     * @param <T>
     * @return
     */
    public static <T> ResponseMessage<T> unauthorized(String message) {
        return error(HttpStatusEnum.OK.getValue(), SystemStatusEnum.UNAUTHORIZED.getCode(), message);
    }

    /**
     * 無權限
     *
     * @param <T>
     * @return
     */
    public static <T> ResponseMessage<T> unauthorized() {
        return error(HttpStatusEnum.OK.getValue(), SystemStatusEnum.UNAUTHORIZED.getCode(), ResponseMessageEnum.NO_ACCESS.getCode());
    }

    /**
     * 請求失敗,包含失敗消息
     *
     * @param message
     * @param <T>
     * @return
     */
    public static <T> ResponseMessage<T> error(String message) {
        return error(HttpStatusEnum.INTERNAL_SERVER_ERROR.getValue(), SystemStatusEnum.UNKNOWN.getCode(), message);
    }

    /**
     * 請求失敗。包含失敗消息與失敗消息args
     *
     * @param message
     * @param args
     * @param <T>
     * @return
     */
    public static <T> ResponseMessage<T> error(String message, Object... args) {
        return error(HttpStatusEnum.INTERNAL_SERVER_ERROR.getValue(), message, args);
    }

    /**
     * 請求失敗
     *
     * @param status
     * @param message
     * @param <T>
     * @return
     */
    public static <T> ResponseMessage<T> error(int status, String message) {
        return error(status, SystemStatusEnum.UNKNOWN.getCode(), message);
    }

    /**
     * 請求失敗
     *
     * @param status
     * @param message
     * @param args
     * @param <T>
     * @return
     */
    public static <T> ResponseMessage<T> error(int status, String message, Object... args) {
        return error(status, SystemStatusEnum.UNKNOWN.getCode(), message, args);
    }

    /**
     * 請求失敗
     *
     * @param status
     * @param code
     * @param message
     * @param <T>
     * @return
     */
    public static <T> ResponseMessage<T> error(int status, String code, String message) {
        return error(status, code, message, null);
    }

    /**
     * 請求失敗
     *
     * @param status
     * @param code
     * @param message
     * @param args
     * @param <T>
     * @return
     */
    public static <T> ResponseMessage<T> error(int status, String code, String message, Object... args) {
        ResponseMessage<T> msg = new ResponseMessage<>();
        msg.message = message;
        msg.status(status);
        msg.code(code);
        return msg.putTimeStamp();
    }

    /**
     * 請求成功,不包含響應值
     */
    public static <T> ResponseMessage<T> ok() {
        return ok(null);
    }

    /**
     * 請求成功,包含響應值
     *
     * @param result
     * @param <T>
     * @return
     */
    public static <T> ResponseMessage<T> ok(T result) {
        return (new ResponseMessage<T>()).result(result).putTimeStamp().code(SystemStatusEnum.SUCCESS.getCode()).status(HttpStatusEnum.OK.getValue());
    }

    /**
     * 設置響應值
     *
     * @param status
     * @return
     */
    public ResponseMessage<T> status(int status) {
        this.status = status;
        return this;
    }

    /**
     * 設置業務邏輯代碼
     *
     * @param code
     * @return
     */
    public ResponseMessage<T> code(String code) {
        this.code = code;
        return this;
    }

    /**
     * 設置結果值
     *
     * @param result
     * @return
     */
    public ResponseMessage<T> result(T result) {
        this.result = result;
        return this;
    }

    /**
     * 設置時間戳
     *
     * @return
     */
    private ResponseMessage<T> putTimeStamp() {
        this.timestamp = System.currentTimeMillis();
        return this;
    }

    /**
     * 響應內容字段
     *
     * @param fields
     * @return
     */
    public ResponseMessage<T> fields(LinkedHashSet<String> fields) {
        this.fields = fields;
        return this;
    }

    /**
     * 相應內容字段組
     *
     * @param field
     * @return
     */
    public ResponseMessage<T> field(String field) {
        if (this.fields == null) {
            synchronized (this) {
                if (this.fields == null) {
                    this.fields = Sets.newLinkedHashSet();
                }
            }
        }
        this.fields.add(field);
        return this;
    }

    /**
     * 重寫toString
     *
     * @return
     */
    @Override
    public String toString() {
        return JSON.toJSONStringWithDateFormat(this, "yyyy-MM-dd HH:mm:ss", new com.alibaba.fastjson.serializer.SerializerFeature[0]);
    }

    /**
     * @param type
     * @param fields
     * @return
     */
    public ResponseMessage<T> include(Class<?> type, String... fields) {
        return include(type, Arrays.asList(fields));
    }

    /**
     * @param type
     * @param fields
     * @return
     */
    public ResponseMessage<T> include(Class<?> type, Collection<String> fields) {
        if (this.includes == null) {
            this.includes = new HashMap<>();
        }
        if (fields == null || fields.isEmpty()) {
            return this;
        }
        fields.forEach(field -> {
            if (field.contains(".")) {
                String[] tmp = field.split("[.]", 2);
                try {
                    Field field1 = type.getDeclaredField(tmp[0]);
                    if (field1 != null) {
                        include(field1.getType(), new String[]{tmp[1]});
                    }
                } catch (Throwable throwable) {
                }
            } else {

                getStringListFromMap(this.includes, type).add(field);
            }
        });
        return this;
    }

    /**
     * @param type
     * @param fields
     * @return
     */
    public ResponseMessage<T> exclude(Class type, Collection<String> fields) {
        if (this.excludes == null) {
            this.excludes = new HashMap<>();
        }
        if (fields == null || fields.isEmpty()) {
            return this;
        }
        fields.forEach(field -> {
            if (field.contains(".")) {
                String[] tmp = field.split("[.]", 2);
                try {
                    Field field1 = type.getDeclaredField(tmp[0]);
                    if (field1 != null) {
                        exclude(field1.getType(), new String[]{tmp[1]});
                    }
                } catch (Throwable throwable) {
                }
            } else {

                getStringListFromMap(this.excludes, type).add(field);
            }
        });
        return this;
    }

    /**
     * @param fields
     * @return
     */
    public ResponseMessage<T> exclude(Collection<String> fields) {
        Class<?> type;
        if (this.excludes == null) {
            this.excludes = new HashMap<>();
        }
        if (fields == null || fields.isEmpty()) {
            return this;
        }

        if (getResult() != null) {
            type = getResult().getClass();
        } else {
            return this;
        }
        exclude(type, fields);
        return this;
    }

    /**
     * @param fields
     * @return
     */
    public ResponseMessage<T> include(Collection<String> fields) {
        Class<?> type;
        if (this.includes == null) {
            this.includes = new HashMap<>();
        }
        if (fields == null || fields.isEmpty()) {
            return this;
        }

        if (getResult() != null) {
            type = getResult().getClass();
        } else {
            return this;
        }
        include(type, fields);
        return this;
    }

    /**
     * @param type
     * @param fields
     * @return
     */
    public ResponseMessage<T> exclude(Class type, String... fields) {
        return exclude(type, Arrays.asList(fields));
    }

    /**
     * @param fields
     * @return
     */
    public ResponseMessage<T> exclude(String... fields) {
        return exclude(Arrays.asList(fields));
    }

    /**
     * @param fields
     * @return
     */
    public ResponseMessage<T> include(String... fields) {
        return include(Arrays.asList(fields));
    }

    /**
     * @param map
     * @param type
     * @return
     */
    protected Set<String> getStringListFromMap(Map<Class<?>, Set<String>> map, Class<?> type) {
        return map.computeIfAbsent(type, k -> new HashSet());
    }
}


希望對您有幫助。

文章推薦:教你搭建多模塊系統

發佈了9 篇原創文章 · 獲贊 26 · 訪問量 8509
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章