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());
}
}
希望對您有幫助。
文章推薦:教你搭建多模塊系統