当前位置: 首页 > news >正文

返回枚举类给前端

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

相关文章:

  • Vue.js条件渲染与列表渲染指南
  • linux设置不记录历史命令
  • Three.js 研究:3、创建一个高科技圆环
  • web前端项目已有阿里巴巴图标基础上,再次导入阿里巴巴图标的方法
  • 第十章:C# 运算符
  • 【数组】Leetcode 228. 汇总区间【简单】
  • 【C语言】实现贪吃蛇--项目实践(超详细)
  • 安卓开发:相机水印设置
  • 【JAVA WEB实用与优化技巧】如何自己封装一个自定义UI的Swagger组件,包含Swagger如何处理JWT无状态鉴权自动TOKEN获取
  • 经典面试题:进程、线程、协程开销问题,为什么进程切换的开销比线程的大?
  • 上位机图像处理和嵌入式模块部署(f103 mcu运行freertos)
  • JVM之【运行时数据区】
  • JDK17新特性整理
  • 扫雷的技巧
  • React封装Canvas组件
  • ----------
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • fetch 从初识到应用
  • nginx 配置多 域名 + 多 https
  • Python实现BT种子转化为磁力链接【实战】
  • STAR法则
  • Vue.js-Day01
  • Web Storage相关
  • 从0搭建SpringBoot的HelloWorld -- Java版本
  • 分布式熔断降级平台aegis
  • 构造函数(constructor)与原型链(prototype)关系
  • 开源SQL-on-Hadoop系统一览
  • 快速构建spring-cloud+sleuth+rabbit+ zipkin+es+kibana+grafana日志跟踪平台
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 山寨一个 Promise
  • 使用 @font-face
  • 使用 QuickBI 搭建酷炫可视化分析
  • 王永庆:技术创新改变教育未来
  • 我的zsh配置, 2019最新方案
  • 一起来学SpringBoot | 第三篇:SpringBoot日志配置
  • 用Python写一份独特的元宵节祝福
  • 正则表达式小结
  • LIGO、Virgo第三轮探测告捷,同时探测到一对黑洞合并产生的引力波事件 ...
  • Mac 上flink的安装与启动
  • ​第20课 在Android Native开发中加入新的C++类
  • ‌移动管家手机智能控制汽车系统
  • #162 (Div. 2)
  • #NOIP 2014# day.1 T2 联合权值
  • (2022版)一套教程搞定k8s安装到实战 | RBAC
  • (大众金融)SQL server面试题(1)-总销售量最少的3个型号的车及其总销售量
  • (接上一篇)前端弄一个变量实现点击次数在前端页面实时更新
  • (十八)SpringBoot之发送QQ邮件
  • (十五)使用Nexus创建Maven私服
  • (一)Docker基本介绍
  • *Algs4-1.5.25随机网格的倍率测试-(未读懂题)
  • .NET 6 Mysql Canal (CDC 增量同步,捕获变更数据) 案例版
  • .net core 实现redis分片_基于 Redis 的分布式任务调度框架 earth-frost
  • .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现
  • .NET Framework .NET Core与 .NET 的区别
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地中转一个自定义的弱事件(可让任意 CLR 事件成为弱事件)