返回枚举类给前端

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
image.png

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. 解决后输出效果

image.png

6. 复盘结论

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值