如何优雅的使用枚举类型,可以这样做!

news2024/9/20 20:49:18

使用枚举有时候会给我们带来了一些困扰:

前端展示数据,需要将枚举转成用户可读的数据显示。

代码中的枚举类型要存储数据库得转成数值类型。

那么本文介绍一种自动转换方案,大大方便前后端使用枚举类型

我们以用户状态为例,用户有两种状态:禁用和启用

图片

图片

第一步创建统一的枚举基类BaseEnum

 

java

public interface BaseEnum {
int getCode();
String getName();
String getEnumName();
static <T extends BaseEnum> T getInstance(Class<T> clazz, String value) {
T[] constants = clazz.getEnumConstants();
for (T t : constants) {
if(StrUtil.isNumeric(value)){
if (t.getCode() == Integer.parseInt(value)) {
return t;
}
}else {
if (t.getEnumName().equals(value)) {
return t;
}
}
}
return null;
}
}

第二步创建用户状态类StatusEnum实现BaseEnum接口

 

java

public enum StatusEnum implements BaseEnum {
ENABLE(0,"启用"),
DISABLE(1,"禁用");
@EnumValue
private int code;
private String name;
StatusEnum(int code, String name) {
this.code = code;
this.name=name;
}
@Override
public int getCode() {
return code;
}
@Override
public String getName() {
return name;
}
@Override
public String getEnumName() {
return this.name();
}
}

BaseEnum主要有三个方法

  1. getCode()获取枚举的数值如“0、1”;

  2. getName()获取枚举显示值如“禁用、启用” ;

  3. getEnumName()获取枚举的枚举值如“ENABLE、DISABLE”.

第三步创建用户类User用户状态使用StatusEnum

 

java

@Data
@TableName("user")
public class User {
private Long id;
private String userName;
private StatusEnum status;
}

前后端相互转换

当前端查询用户时,我们希望将枚举的三个属性都返回给前端,前端页面显示时取status.name代码中使用status.enum或者status.code

 

json

{
"id": 3581209395268,
"userName": "test2@8531.cn",
"status": {
"name": "禁用",
"enum": "DISABLE",
"code": 1
}
}

为了达到将枚举序列化成一个json对象,我们需要自定义序列化器和反序列化器,以下以SpringBoot自带的Jackson为例:

 

java

public class BaseEnumSerializer extends StdSerializer<BaseEnum> {
public BaseEnumSerializer() {
this(null);
}
public BaseEnumSerializer(Class<BaseEnum> t) {
super(t);
}
@Override
public void serialize(BaseEnum value, JsonGenerator gen, SerializerProvider provider) throws IOException {
gen.writeStartObject();
gen.writeStringField("name",value.getName());
gen.writeStringField("enum",value.getEnumName());
gen.writeNumberField("code",value.getCode());
gen.writeEndObject();;
}
}
public class BaseEnumDeserializer<T extends BaseEnum> extends StdDeserializer<T> {
private Class<T> type;
public BaseEnumDeserializer() {
this(null);
}
public BaseEnumDeserializer(Class<T> vc) {
super(vc);
type = vc;
}
@Override
public T deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
return BaseEnum.getInstance(type, p.getText());
}
}

 

图片

 

java

'public class NumBaseEnumConverterFactory implements ConverterFactory<Number, BaseEnum> {
@Override
public <T extends BaseEnum> Converter<Number, T> getConverter(Class<T> aClass) {
return new NumberToEnumConverter<>(aClass);
}
private final class NumberToEnumConverter<T extends BaseEnum> implements Converter<Number, T> {
private Class<T> enumType;
public NumberToEnumConverter(Class<T> enumType) {
this.enumType = enumType;
}
@Override
public T convert(Number s) {
return BaseEnum.getInstance(enumType,s.toString());
}
}
}

public class StrBaseEnumConverterFactory implements ConverterFactory<String, BaseEnum> {
@Override
public <T extends BaseEnum> Converter<String, T> getConverter(Class<T> aClass) {
return new StringToEnumConverter<>(aClass);
}
private final class StringToEnumConverter<T extends BaseEnum> implements Converter<String, T> {
private Class<T> enumType;
public StringToEnumConverter(Class<T> enumType) {
this.enumType = enumType;
}
@Override
public T convert(String s) {
return BaseEnum.getInstance(enumType,s);
}
}
}


 

图片

 

java

@Configuration
public class WebConfig implements WebMvcConfigurer {

@Bean
public ObjectMapper objectMapper() {
ObjectMapper mapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addSerializer(BaseEnum.class, new BaseEnumSerializer());
module.addDeserializer(BaseEnum.class, new BaseEnumDeserializer<>());
mapper.registerModule(module);
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
return mapper;
}
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addConverterFactory(new StrBaseEnumConverterFactory());
registry.addConverterFactory(new NumBaseEnumConverterFactory());
}
}

查询用户

图片

application/json格式传参

图片

对应JAVA代码:

 

JAVA

@RestController
public class UserController {
@Resource
private UserMapper userMapper;

@GetMapping("/user/{id}")
public User getById(@PathVariable Long id) {
return userMapper.selectById(id);
}

@PostMapping("/user")
public User upadteById(@RequestBody User user) {
userMapper.updateById(user);
return user;
}

@PutMapping("/user")
public User updateUser(User user) {
userMapper.updateById(user);
return user;
}

@PutMapping("/user/{id}")
public User updateUserStatus(@PathVariable Long id,@RequestParam StatusEnum status) {
User user=userMapper.selectById(id);
user.setStatus(status);
userMapper.updateById(user);
return user;
}
}

 

这样很方便的解决了枚举在各个环节的自动转换问题,其它枚举只要实现BaseEnum接口就能实现全自动转换,前后端用起来也方便了不少。

最后说一句(求关注!别白嫖!)

如果这篇文章对您有所帮助,或者有所启发的话,求一键三连:点赞、转发、在看。

关注公众号:woniuxgg,在公众号中回复:笔记  就可以获得蜗牛为你精心准备的java实战语雀笔记,回复面试、开发手册、有超赞的粉丝福利!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1983140.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

创建型模式(Creational Patterns)之工厂模式(Factory Pattern)之工厂方法模式(Factory Method Pattern)

1. 工厂方法模式(Factory Method Pattern) 将对象的创建延迟到子类中实现&#xff0c;每个具体产品类都有一个对应的工厂类负责创建&#xff0c;从而使得系统更加灵活。客户端可以通过调用工厂方法来创建所需的产品&#xff0c;而不必关心具体的实现细节。这种模式符合开放-封闭…

客户数据分析模型:RFM模型的深度解析与应用探索

RFM模型&#xff0c;作为客户数据分析中的经典工具&#xff0c;凭借其简单而强大的分析能力&#xff0c;被广泛应用于各行各业。本文旨在深入探讨RFM模型的核心原理、应用价值&#xff0c;并详细阐述其在2C&#xff08;面向消费者&#xff09;和2B&#xff08;面向企业&#xf…

Lumerical 光束重叠率计算

Lumerical 光束重叠率计算 引言正文不同位置处 FDE Solver 对仿真结果的影响FDE Solver 不同尺寸下的光束重叠率计算引言 在 Lumerical 光纤模式仿真 一文中我们介绍了如何进行光纤模式的仿真。本文,我们将继续使用 SMF28 来进行光束重叠率计算说明。 正文 不同位置处 FDE …

大数据技术原理-spark的安装

摘要 本实验报告详细记录了在"大数据技术原理"课程中进行的Spark安装与应用实验。实验环境包括Spark、Hadoop和Java。实验内容涵盖了Spark的安装、配置、启动&#xff0c;以及使用Spark进行基本的数据操作&#xff0c;如读取本地文件、文件内容计数、模式匹配和行数…

【未授权访问漏洞复现~~~】

一: Redis未授权访问漏洞 步骤一:进入vulhub目录使用以下命令启动靶机… 进入目录:cd /vulhub-master/redis/4-unacc 启动:docker-compose up-d 检查:docker-compose ps步骤二:在Kali上安装redis程序进行服务的链接. #安装redis apt-get install redis #redis链接 redis-cli…

【Linux进程篇】并发艺术:Linux条件变量与生产消费者模型的完美融合

W...Y的主页 &#x1f60a; 代码仓库分享&#x1f495; 前言&#xff1a;我们上篇博客中提到了线程互斥、引出了互斥锁解决了线程中的未将临界资源保护的问题。但是随之出来的问题——竞争锁是自由竞争的&#xff0c;竞争锁的能力太强的线程会导致其他线程抢不到票&#xff0…

Linux——线程互斥与同步

一、线程互斥 1.1 线程间互斥的概念 在学习管道的时候&#xff0c;管道是自带同步与互斥的。而在线程中&#xff0c;当多个线程没有加锁的情况下同时访问临界资源时会发生混乱。在举例之前&#xff0c;先了解几个概念。 临界资源&#xff1a;多个线程执行流共享的资源叫做临…

软甲测试定义和分类

软件测试定义 使用人工和自动手段来运行或测试某个系统的过程&#xff0c;其目的在于检验他是否满足规定的需求或弄清预期结果与实际结果之间的差别 软件测试目的 为了发现程序存在的代码或业务逻辑错误 – 第一优先级发现错误为了检验产品是否符合用户需求 – 跟用户要求实…

WPF学习(3)- WrapPanel控件(瀑布流布局)+DockPanel控件(停靠布局)

WrapPanel控件&#xff08;瀑布流布局&#xff09; WrapPanel控件表示将其子控件从左到右的顺序排列&#xff0c;如果第一行显示不了&#xff0c;则自动换至第二行&#xff0c;继续显示剩余的子控件。我们来看看它的结构定义&#xff1a; public class WrapPanel : Panel {pub…

【网页设计】基于HTML+CSS上海旅游网站网页作业制作

一、&#x1f468;‍&#x1f393;网站题目 旅游&#xff0c;当地特色&#xff0c;历史文化&#xff0c;特色小吃等网站的设计与制作。 二、✍️网站描述 &#x1f468;‍&#x1f393;静态网站的编写主要是用HTML DIVCSS 等来完成页面的排版设计&#x1f469;‍&#x1f39…

CSP初赛知识点讲解(一)

CSP初赛知识点讲解&#xff08;一&#xff09; 信息学竞赛哈夫曼树 哈夫曼编码冯.诺依曼理论计算机奖项例题训练&#xff08;一&#xff09;操作系统例题训练&#xff08;二&#xff09;计算机语言例题训练&#xff08;三&#xff09; 信息学竞赛 全国青少年计算机程序设计竞赛…

VINS-Fusion 多传感器全局位姿估计的一种通用优化框架

摘要 对于自动导航的机器人来说,精确的状态估计是基本问题。为了实现局部精确和全局无漂移的位姿估计,通常将具有互补属性的多个传感器进行融合。在一个小的区域内,局部传感器,如相机、IMU、Lidar等,提供了精确的位姿,而在一个大场景环境下,全局传感器,如gps、magneto…

java 变量及其常量

变量 数据类型关键字内存占用取值范围字节型byte1个字节-128 至 127 定义byte变量时超出范围,废了短整型short2个字节-32768 至 32767整型int&#xff08;默认&#xff09;4个字节-231 至 231-1 正负21个亿-2147483648——2147483647长整型long8个字节-263 至 263-1 19位数字-9…

【51单片机DS1302时钟芯片读取数码管显示打造小成本高品质】2022-12-23

缘由https://ask.csdn.net/questions/7867303 /*写回复缘由https://ask.csdn.net/questions/7867303*/ #include "reg52.h" sbit RSTP3^5;//DS1302允许(读/写)当RST为高电平时&#xff0c;所有的数据传送被初始化&#xff0c;允许对DS1302进行操作。如果在传送过程中…

不用PS也能抠图?点哪抠哪,简直是职场人的最强助手

抠图你还在用 PS 一点点抠吗&#xff1f; 不仅费时费力&#xff0c;还常常达不到理想效果&#xff0c;真的太让人崩溃了 但别担心&#xff0c;我找到了一个超棒的工具——千鹿设计助手的AI智能抠图插件。它就像你的私人设计小助手&#xff0c;能快速帮你把想要的元素抠出来&…

Mendix 创客访谈录|Mendix 如何化解工业企业数字化转型的复杂性

本期创客 田月萍 西门子 Advanta研发部门 大家好&#xff0c;我是田月萍&#xff0c;来自西门子Advanta的研发部门&#xff0c;专注于工业数字化转型。在我的职业生涯中&#xff0c;参与了多个关键项目的开发&#xff0c;涵盖了制造执行系统&#xff08;MES&#xff09;的实施&…

ECMA6Script学习笔记(六)

【摘要】 本文是对自己学习ES6的学习笔记回顾,后面是概要:文章深入探讨了ES6模块化处理&#xff0c;强调模块化在提高代码可维护性、可复用性和可扩展性方面的重要性。介绍了ES6模块化的三种导出方式&#xff1a;分别导出、统一导出和默认导出&#xff0c;并通过具体的代码示例…

3.特征工程-特征抽取、特征预处理、特征降维

文章目录 环境配置&#xff08;必看&#xff09;头文件引用1.数据集: sklearn代码运行结果 2.字典特征抽取: DictVectorizer代码运行结果稀疏矩阵 3.文本特征抽取(英文文本): CountVectorizer()代码运行结果 4.中文文本分词(中文文本特征抽取使用)代码运行结果 5.中文文本特征抽…

一款功能强大且免费的Windows系统优化工具

TweakPower是一款功能强大的Windows系统优化工具&#xff0c;旨在帮助用户提升电脑性能、清理垃圾文件、备份数据以及修复系统问题。该软件提供了多种实用功能&#xff0c;包括内存管理、垃圾清理、数据备份、数据擦除、硬盘维护和性能调度调整等。 TweakPower的主要界面或仪表…

如意玲珑支持发行版再添新成员,openEuler安装使用如意玲珑操作指南

查看原文 如意玲珑&#xff08;Linyaps&#xff09;项目已与开放原子开源基金会完成捐赠协议签署&#xff0c;目前如意玲珑已成为基金会的正式孵化期项目。 如意玲珑是开源软件包格式&#xff0c;用于替代 deb、rpm等包管理工具&#xff0c;实现应用包管理、分发、容器、集成开…