统一返回对象突然多个success属性
今天在测试的时候突然发现统一返回对象里面多个success属性:
@Data
@Accessors(chain = true)
public class ApiResponse<T> {
private int code;
private String reason;
private T data;
public ApiResponse(T data) {
this.data = data;
}
public ApiResponse(String reason, int code) {
this.code = code;
this.reason = reason;
}
public ApiResponse() {
}
public boolean isSuccess() {
return ResultCode.SUCESS.getErrorCode() == code;
}
public static <T> ApiResponse success(T data) {
ApiResponse<T> responseResult = new ApiResponse<T>(data);
responseResult.setCode(ResultCode.SUCESS.getErrorCode());
return responseResult;
}
public static <T> ApiResponse fail(T data) {
ApiResponse<T> responseResult = new ApiResponse<T>();
responseResult.setCode(ResultCode.INTERNAL_ERROR.getErrorCode());
responseResult.setReason(data.toString());
return responseResult;
}
public static void main(String[] args) {
ApiResponse success = ApiResponse.success(1);
System.out.println(JSONObject.toJSONString(success));
HashMap<Object, Object> objectObjectHashMap = Maps.newHashMap();
objectObjectHashMap.put("code", 1);
objectObjectHashMap.put("reason", 1);
objectObjectHashMap.put("data", 1);
System.out.println(JSONObject.toJSONString(objectObjectHashMap));
}
}
这是resoult返回的枚举.
public enum ResultCode {
SUCESS(0, "请求成功"),
NO_CONTENT(204, "请求无内容"),
USER_NOT_LOGIN(401, "用户未登录"),
USER_LOGIN_FAIL(-2, "用户登录失败"),
USER_ACCESS_FORBIDDEN(403, "用户授权失败"),
NOT_FOUND(404, "资源不存在"),
INTERNAL_ERROR(500, "服务器错误"),
SYSTEM_ERROR(501, "系统繁忙"),
BUSINESS_SUCESS(1, "数据正常返回"),
UNKNOWN(-1, "系统异常"),
BUSINESS_FAILURE(-2, "业务异常"),
INVALID_ARGUMENT(11001, "非法参数");
private static final Map<Integer, ResultCode> values = new HashMap();
private int errorCode;
private String error;
private ResultCode(int errorCode, String error) {
this.errorCode = errorCode;
this.error = error;
}
public static ResultCode valueOf(int code) {
ResultCode ec = (ResultCode) values.get(Integer.valueOf(code));
return ec != null ? ec : UNKNOWN;
}
public int getErrorCode() {
return this.errorCode;
}
public String getError() {
return this.error;
}
static {
ResultCode[] var0 = values();
int var1 = var0.length;
for (int var2 = 0; var2 < var1; ++var2) {
ResultCode ec = var0[var2];
values.put(Integer.valueOf(ec.errorCode), ec);
}
}
}
这是执行结果:
转成json的时候多个success属性,然后查看ApiResponse里面有个isSuccess方法,去掉之后,success属性没有,
怀疑是方法名称叫做isSUccess方法,然后进行json序列化的的时候加上了这个属性.用的阿里的fastjson.
在isSuccess方法打个断点:
序列化的时候,debug进来了.应该是fastjson序列化的时候把属性加上去了.
但是倒数第二个栈点进不去
阿里开发手册:
fastjson和jackson在把对象序列化成json字符串的时候,是通过反射遍历出该类中的所有getter方法,得到getHollis和isSuccess,然后根据JavaBeans规则,他会认为这是两个属性hollis和success的值。直接序列化成json:{“success”:true}
为什么强烈禁止开发人员使用isSuccess作为变量名
世界上所有的不公平都是由于当事人能力不足造成的.