通用公共响应结果对象设计
解决的问题
- 使用限定泛型系列化
Result<T extends Serializable>
,避免适用过程中传入未序列化的对象导致序列化问题,从根本解决序列化问题。1 - 增加序列化的扩展字段
private Serializable extend
,在某些场景,我们不仅会返回结果还会返回扩展结果,这时这个字段就很有用,并且这里避免了序列化对象问题。 - 封装常用静态响应结果方法,使用时
Result.ok(...)
一行代码搞定,简单易用。
完整代码
import lombok.Data;
import java.io.Serializable;
import java.util.Collection;
/**
* 接口公共响应对象
* @author fay
* @date 2022-01-24
*/
@Data
public class Result<T extends Serializable> implements Serializable {
private static final long serialVersionUID = 1L;
/**请求成功标识*/
private boolean success = true;
/**响应码*/
private Integer code = OK_200;
/**响应消息*/
private String message = OK_MSG;
/**响应对象*/
private T data;
/**响应列表*/
private Collection<T> dataList;
/**响应扩展*/
private Serializable extend;
/**时间戳*/
private long timestamp = System.currentTimeMillis();
/**默认响应码:200成功,500失败,401无权限*/
public static final int OK_200 = 200;
public static final int ERROR_500 = 500;
public static final int NO_AUTH_401 = 401;
/**默认响应消息*/
public static final String OK_MSG = "成功";
public static final String ERROR_MSG = "失败";
public static final String NO_AUTH_MSG = "无权限";
public static <T extends Serializable> Result<T> ok() {
return Result.ok(OK_MSG);
}
public static <T extends Serializable> Result<T> ok(String message) {
return Result.ok(null, null, null, message);
}
public static <T extends Serializable> Result<T> ok(T data) {
return Result.ok(data, OK_MSG);
}
public static <T extends Serializable> Result<T> ok(T data, String message) {
return Result.ok(data, null, null, message);
}
public static <T extends Serializable> Result<T> ok(Collection<T> dataList) {
return Result.ok(dataList, OK_MSG);
}
public static <T extends Serializable> Result<T> ok(Collection<T> dataList, String message) {
return Result.ok(null, dataList, null, message);
}
public static <T extends Serializable> Result<T> ok(T data, Serializable extend) {
return Result.ok(data, null, extend, OK_MSG);
}
public static <T extends Serializable> Result<T> ok(Collection<T> dataList, Serializable extend) {
return Result.ok(null, dataList, extend, OK_MSG);
}
public static <T extends Serializable> Result<T> error() {
return Result.error(ERROR_MSG);
}
public static <T extends Serializable> Result<T> error(String message) {
return Result.error(ERROR_500, message);
}
public static <T extends Serializable> Result<T> error(Integer code, String message) {
Result<T> result = new Result<>();
result.code = code;
result.message = message;
result.success = false;
return result;
}
/**
* 无权访问
*/
public static <T extends Serializable> Result<T> noAuth() {
return Result.error(NO_AUTH_401, NO_AUTH_MSG);
}
private static <T extends Serializable> Result<T> ok(T data, Collection<T> dataList,
Serializable extend, String message) {
Result<T> result = new Result<>();
result.code = OK_200;
result.data = data;
result.dataList = dataList;
result.extend = extend;
result.message = message;
return result;
}
}
使用sonar扫描代码能快速得知我们代码里可能存在的风险点及风险级别。 ↩︎