1. 前言
在实际开发过程中,前端的下拉框或者单选按钮的内容通常的需要和后端匹配的,故一般会由后端将下拉框的内容或单选框的内容传给前端,而这些内容在后端一般是由枚举类存储的,如果后端直接返回枚举类,返回结果将会是枚举类的名称,而不是枚举类中的字段内容,这不是我们想要的结果。
 
2. 示例代码:
2.1 controller层
 
package com.suhuamo.test.controller;
import com.suhuamo.test.enums.OpenStatusEnum;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
 * @author suhuamo
 * @date 2024-05-26
 * @slogan U R MY SPECIAL
 * @description
 */
@RestController
@RequestMapping("/test")
public class TestController {
    /**
     * 获取当前开关状态
     * @return OpenStatusEnum
     * {@link com.suhuamo.test.enums.OpenStatusEnum}
     * @version 1.0
     * @author suhuamo
     */
    @GetMapping("/open-status/now")
    public OpenStatusEnum getOpenStatus()
    {
        return OpenStatusEnum.OPEN;
    }
}
2.2 enum代码
 
package com.suhuamo.test.enums;
import lombok.Getter;
/**
 * @author suhuamo
 * @date 2024-05-26
 * @slogan 五秒钟内说出三个你爱的人的名字...5..4..3..2..1..你是不是没有说自己,也要爱自己哦。
 * @description 开关状态枚举类
 */
@Getter
public enum OpenStatusEnum {
    CLOSE(0, "关闭"),
    OPEN(1, "开启");
    /**
     * 类型
     */
    private final Integer type;
    /**
     * 描述
     */
    private final String desc;
    OpenStatusEnum(Integer type, String desc) {
        this.type = type;
        this.desc = desc;
    }
    public Integer getType() {
        return type;
    }
    public String getDesc() {
        return desc;
    }
    /**
     * 根据类型获取枚举,当无该类型时,返回null
     *
     * @param type
     * @return OpenStatus
     */
    public static OpenStatusEnum getByType(Integer type) {
        for (OpenStatusEnum itemEnum : OpenStatusEnum.values()) {
            if (itemEnum.getType().equals(type)) {
                return itemEnum;
            }
        }
        return null;
    }
}
3. 目前输出效果
在浏览器中输入:localhost:{端口}/test/open-status/now即可访问。【我配置的项目端口是8888,故端口输入的是8888】
 
4. 解决办法
在枚举类上添加注解 @JsonFormat(shape = JsonFormat.Shape.OBJECT)。
即枚举类的代码修改为:
package com.suhuamo.test.enums;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Getter;
/**
 * @author suhuamo
 * @date 2024-05-26
 * @slogan 五秒钟内说出三个你爱的人的名字...5..4..3..2..1..你是不是没有说自己,也要爱自己哦。
 * @description 开关状态枚举类
 */
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
@Getter
public enum OpenStatusEnum {
    CLOSE(0, "关闭"),
    OPEN(1, "开启");
    /**
     * 类型
     */
    private final Integer type;
    /**
     * 描述
     */
    private final String desc;
    OpenStatusEnum(Integer type, String desc) {
        this.type = type;
        this.desc = desc;
    }
    public Integer getType() {
        return type;
    }
    public String getDesc() {
        return desc;
    }
    /**
     * 根据类型获取枚举,当无该类型时,返回null
     *
     * @param type
     * @return OpenStatus
     */
    public static OpenStatusEnum getByType(Integer type) {
        for (OpenStatusEnum itemEnum : OpenStatusEnum.values()) {
            if (itemEnum.getType().equals(type)) {
                return itemEnum;
            }
        }
        return null;
    }
}
5. 解决后输出效果

 
6. 复盘结论
- 出现问题的原因是因为在调用接口返回数据时,所有的对象都会被转换为JSON格式发送给前端,而枚举类的JSON格式的内容默认是枚举值的名称。
- 加上注解@JsonFormat(shape = JsonFormat.Shape.OBJECT)就可以解决问题的原因是因为在转换JSON格式时,带有该注解可以将对象按照对象的形式进行序列化,即**<字段名称,字段内容>**的键值对形式进行序列化。
- 附带的问题就是反序列化会出现问题,即存入Redis时没问题,但是取出有问题的。【故建议不要存Redis】











![[JDK工具-5] jinfo jvm配置信息工具](https://img-blog.csdnimg.cn/direct/c821a67cd234429a805ba3976bb529e5.png)






