统一返回对象突然多个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作为变量名

posted @ 2019-11-14 11:32  你就像甜甜的益达  阅读(222)  评论(0编辑  收藏  举报