Skip to content
This repository was archived by the owner on Oct 23, 2024. It is now read-only.
This repository was archived by the owner on Oct 23, 2024. It is now read-only.

枚举类的枚举变量实现接口以后,@JSONType(serializeEnumAsJavaBean = true)注解或者configEnumAsJavaBean失效 #1496

@dongyeo

Description

@dongyeo
 <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.38</version>
 </dependency>

接口

public interface ISetupStatusInfo {
    List<SetupStatus> nextList();

    Boolean isFirst();

    Boolean isLast();
}
public interface ISetupStatusProcess {

    /**
     *
     * @return
     */
    SetupStatus refuse();

    /**
     * 状态转移失败返回null
     *
     * @param name
     * @return
     */
    SetupStatus next(String name);

}

枚举实现

@JSONType(serializeEnumAsJavaBean = true)
public enum SetupStatus implements ISetupStatusInfo, ISetupStatusProcess {
    EDIT(0, "EDIT", "编辑中") {
        @Override
        public List<SetupStatus> nextList() {
            return Arrays.asList(FIRST_TRAIL);
        }

        @Override
        public Boolean isFirst() {
            return true;
        }

        @Override
        public SetupStatus refuse() {
            return EDIT;
        }

    }, FIRST_TRAIL(1, "FIRST_TRAIL", "初审") {
        @Override
        public List<SetupStatus> nextList() {
            return Arrays.asList(EXPERT, FINAL_TRAIL);
        }

        @Override
        public SetupStatus refuse() {
            return EDIT;
        }

    }, EXPERT(2, "EXPERT", "专家补充意见", false) {
        @Override
        public List<SetupStatus> nextList() {
            return Arrays.asList(FINAL_TRAIL);
        }

    }, FINAL_TRAIL(3, "FINAL_TRAIL", "公益委员会/理事会/理事长审核") {
        @Override
        public List<SetupStatus> nextList() {
            return Arrays.asList(PASS);
        }

        @Override
        public SetupStatus refuse() {
            return EDIT;
        }
    }, PASS(4, "PASS", "项目通过", false) {
        @Override
        public List<SetupStatus> nextList() {
            return Arrays.asList(SIGN);
        }
    }, SIGN(5, "SIGN", "协议签署", false) {
        @Override
        public List<SetupStatus> nextList() {
            return Arrays.asList(ACTIVE);
        }
    }, ACTIVE(6, "ACTIVE", "启动") {
        @Override
        public List<SetupStatus> nextList() {
            return null;
        }

        @Override
        public Boolean isLast() {
            return true;
        }
    };
    private int code;
    private String name;
    private String nameCn;
    private boolean canRefuse;

    SetupStatus(int code, String name, String nameCn) {
        this.code = code;
        this.name = name;
        this.nameCn = nameCn;
        this.canRefuse = true;
    }

    SetupStatus(int code, String name, String nameCn, boolean canRefuse) {
        this.code = code;
        this.name = name;
        this.nameCn = nameCn;
        this.canRefuse = canRefuse;
    }

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getNameCn() {
        return nameCn;
    }

    public void setNameCn(String nameCn) {
        this.nameCn = nameCn;
    }

    public boolean isCanRefuse() {
        return canRefuse;
    }

    public void setCanRefuse(boolean canRefuse) {
        this.canRefuse = canRefuse;
    }

    public static SetupStatus getFromCode(Integer code) {
        if (code == null) {
            return null;
        }
        for (SetupStatus status : values()) {
            if (status.code == code) {
                return status;
            }
        }
        throw new IllegalArgumentException("unknown SetupStatus enumeration code:" + code);
    }

    public static SetupStatus getFromName(String name) {
        if (name == null) {
            return null;
        }
        for (SetupStatus status : values()) {
            if (status.name.equals(name)) {
                return status;
            }
        }
        return null;
    }

    @Override
    public Boolean isFirst() {
        return false;
    }

    @Override
    public Boolean isLast() {
        return false;
    }

    @Override
    public SetupStatus refuse() {
        return null;
    }

    @Override
    public SetupStatus next(String name) {
        SetupStatus status = getFromName(name);
        return name != null && this.nextList().contains(status) ? status : null;
    }

    @Override
    public String toString() {
        return "SetupStatus{" + "code=" + code + ", name='" + name + '\'' + ", nameCn='" + nameCn + '\'' + ", canRefuse=" + canRefuse + '}';
    }

    public static void main(String[] args) {
        SerializeConfig serializeConfig = new SerializeConfig();
        System.out.println("edit class:" + EDIT.getClass());
        System.out.println("setupStatus class:" + SetupStatus.class);
        //配置
        serializeConfig.configEnumAsJavaBean(EDIT.getClass());
        serializeConfig.configEnumAsJavaBean(SetupStatus.class);
        //输出
        System.out.println("通过枚举值getClass配置的枚举值可以使用javaBean序列化函数:"+JSON.toJSONString(EDIT, serializeConfig));
        System.out.println("通过枚举类.class配置的枚举值不可以可以使用javaBean序列化函数:"+JSON.toJSONString(FINAL_TRAIL, serializeConfig));
    }
}

输出

edit class:class com.alijijinhui.enums.project.SetupStatus$1
setupStatus class:class com.alijijinhui.enums.project.SetupStatus
通过枚举值getClass配置的枚举值可以使用javaBean序列化函数:{"canRefuse":true,"code":0,"declaringClass":"com.alijijinhui.enums.project.SetupStatus","first":true,"last":false,"name":"EDIT","nameCn":"编辑中"}
通过枚举类.class配置的枚举值不可以可以使用javaBean序列化函数:"FINAL_TRAIL"

应该是实现接口后的枚举值成了内部类,类名不同,无法根据枚举类直接获取设置好的javaBeanSerializer

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions