自定义注解获取属性对应枚举的翻译值

平时在开发的时候难免会遇到枚举来翻译类,于是写一个自定义注解来在开发的时候自动翻译枚举的值
相关代码如下:

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@JacksonAnnotationsInside
public @interface EnumShow {/*** 要转换成的枚举** @return*/Class<? extends BaseEnum<?>> enumClass();/*** 如果不复写本身新增字段是本身字段的增加的后缀** @return*/String suffix() default "Str";}

这段Java代码定义了一个名为EnumShow的注解,用于标注字段。该注解有以下功能:
enumClass属性指定要将字段转换成的枚举类,该枚举类需要继承自BaseEnum。
suffix属性指定当新增字段时,字段名称的后缀,默认为"Str"。
这个注解的作用是配合Jackson库将标注了该注解的字段序列化为指定枚举类的JSON格式。

@JsonComponent
public class EnumShowIntegerSerializer extends JsonSerializer<Integer> implements ContextualSerializer {private EnumShow enumShow;public EnumShowIntegerSerializer() {}public EnumShowIntegerSerializer(final EnumShow enumShow) {this.enumShow = enumShow;}/*** 序列化整数枚举值。* 根据枚举类的实现情况,决定如何序列化枚举值。* 如果枚举类实现了BaseEnum接口,直接通过接口方法获取描述。* 如果枚举类没有实现BaseEnum接口,通过反射调用getKey和getValue方法获取描述。* * @param integer   需要序列化的整数枚举值。* @param jsonGenerator   用于生成JSON的工具。* @param serializerProvider   序列化提供者,用于获取其他序列化器。* @throws IOException 如果序列化过程中发生I/O错误。*/@SneakyThrows@Overridepublic void serialize(Integer integer, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {if (null == integer || null == enumShow) {jsonGenerator.writeObject(integer);return;}String fieldName = jsonGenerator.getOutputContext().getCurrentName();Class<?>[] interfaces = enumShow.enumClass().getInterfaces();String theMsg = null;if (interfaces.length > 0) {Class<?> baseInterface = interfaces[0];if (baseInterface.equals(BaseEnum.class)) {Class newIns = enumShow.enumClass();Optional<? extends BaseEnum<?>> enumOpt = BaseEnum.of(newIns, integer);if (enumOpt.isPresent()) {theMsg = enumOpt.get().getValue();}}} else {if (enumShow.enumClass().isEnum()) {Method codeMethod = enumShow.enumClass().getDeclaredMethod("getKey");Method descMethod = enumShow.enumClass().getDeclaredMethod("getValue");for (Object obj : enumShow.enumClass().getEnumConstants()) {if (integer.equals(codeMethod.invoke(obj))) {theMsg = descMethod.invoke(obj).toString();}}}}jsonGenerator.writeNumber(integer);jsonGenerator.writeStringField(fieldName + enumShow.suffix(), theMsg);}/*** 根据上下文创建自定义的序列化器。* 如果属性上有EnumShow注解,则创建EnumShowIntegerSerializer;* 如果没有相关的注解,则返回默认的整数序列化器。* * @param serializerProvider   序列化提供者,用于获取其他序列化器。* @param beanProperty   当前属性的信息,用于获取注解。* @return 自定义的序列化器或默认的整数序列化器。* @throws JsonMappingException 如果创建序列化器过程中发生错误。*/@Overridepublic JsonSerializer<?> createContextual(SerializerProvider serializerProvider, BeanProperty beanProperty) throws JsonMappingException {if (beanProperty != null) {EnumShow annotation = beanProperty.getAnnotation(EnumShow.class);if (annotation != null) {return new EnumShowIntegerSerializer(annotation);}}return NumberSerializer.instance;}

这个Java类是一个自定义的JSON序列化器,用于将Java的整数类型(Integer)序列化为JSON格式。它继承了Jackson库中的JsonSerializer类,并实现了ContextualSerializer接口。
EnumShowIntegerSerializer 类的作用是根据EnumShow注解的配置,对整数类型的枚举值进行序列化时,除了输出数值本身,还会额外输出一个带有特定suffix的字符串字段,该字段的值是根据枚举值的特定规则计算得到的。
serialize 方法用于将整数序列化为JSON。如果传入的整数或enumShow为null,则直接将整数序列化为JSON。否则,根据enumShow的配置获取枚举类,并根据枚举类的特性进行处理:
如果枚举类实现了BaseEnum接口,则通过BaseEnum.of方法获取枚举值,并获取其对应的字符串值。
如果枚举类为普通的Java枚举,则通过反射获取枚举值的键和值方法,并遍历枚举常量,找到对应整数值的枚举值,并获取其值。
createContextual 方法用于根据属性上的注解(EnumShow或DictShow)创建并返回一个适当的自定义序列化器。如果属性上有EnumShow注解,则返回一个新的EnumShowIntegerSerializer实例;如果有DictShow注解,则返回一个新的DictShowIntegerSerializer实例;否则,返回一个默认的数字序列化器NumberSerializer.instance。
这个自定义序列化器可以用于Spring Boot应用程序中,通过@JsonComponent注解将其注册为一个Jackson组件,以便在序列化过程中自动使用。
然后对所需要的属性上加上@EnumShow注解,如下图例子
微信截图_20240610205030.png
image.png
在测试输出数据后,即可输出一个与之对应字段的翻译。

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

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

相关文章

web错题(1)

action属性是form标签的必须属性&#xff0c;用于指定表单提交时表单数据将被发往哪里 dir能够指定文本显示方向的属性 可以产生下拉列表的标记时<select> multiple属性设为true&#xff0c;表示输入字段可以选择多个值 lable标签的for属性可以把lable绑定到另一个元…

meilisearch,老版本的文档

Elasticsearch 做为老牌搜索引擎&#xff0c;功能基本满足&#xff0c;但复杂&#xff0c;重量级&#xff0c;适合大数据量。 MeiliSearch 设计目标针对数据在 500GB 左右的搜索需求&#xff0c;极快&#xff0c;单文件&#xff0c;超轻量。 所以&#xff0c;对于中小型项目来说…

Unity 之通过自定义协议从浏览器启动本地应用程序

内容将会持续更新&#xff0c;有错误的地方欢迎指正&#xff0c;谢谢! Unity 之通过自定义协议从浏览器启动本地应用程序 TechX 坚持将创新的科技带给世界&#xff01; 拥有更好的学习体验 —— 不断努力&#xff0c;不断进步&#xff0c;不断探索 TechX —— 心探索、心进…

PHP框架详解- symfony框架

GPT-4 (OpenAI) Symfony 是一个用 PHP 语言编写的开放源代码的 web 应用框架。Symfony 提供了一组可重用的组件和一个标准化、可扩展的框架&#xff0c;用于构建 web 应用、API、微服务等。它跟其他流行 PHP 框架&#xff08;比如 Laravel&#xff09;一样&#xff0c;旨在加快…

Servlet接口实现

项目搭建 pom文件引入依赖与打包配置。 <dependencies><!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api --><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId>…

java:spring actuator添加自定义endpoint

# 项目代码资源&#xff1a; 可能还在审核中&#xff0c;请等待。。。 https://download.csdn.net/download/chenhz2284/89437274 # 项目代码 【pom.xml】 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId&…

探索C嘎嘎的奇妙世界:第四关---引用与内联函数

1 引用: 引用不是新定义一个变量&#xff0c;而是给已存在变量取了一个别名&#xff0c;编译器不会为引用变量开辟内存空间&#xff0c;它和它引用的变量共用同一块内存空间。 #include<iostream> using namespace std;int main() {int a 0;// 引用&#xff1a;…

分数计算 初级题目

今天继续更题。今天的题目是《第五单元 分数的加减法》初级题目。 定位&#xff1a;题目较为初级&#xff0c;适合预习 参考答案&#xff1a;CACCADACAABACBBCDBCB

Linux文本处理三剑客+正则表达式

Linux文本处理常用的3个命令&#xff0c;脚本或者文本处理任务中会用到。这里做个整理。 三者的功能都是处理文本&#xff0c;但侧重点各不相同&#xff0c;grep更适合单纯的查找或匹配文本&#xff0c;sed更适合编辑匹配到的文本&#xff0c;awk更适合格式化文本&#xff0c;对…

【数据结构】第十六弹---C语言实现希尔排序

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】 目录 1、希尔排序( 缩小增量排序 ) 1.1、预排序实现 1.2、希尔排序代码实现 1.3、代码测试 1.4、时空复杂度分析 1.5、性能比较 总结 上一弹我们…

2024年【四川省安全员C证】考试题及四川省安全员C证考试资料

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 四川省安全员C证考试题是安全生产模拟考试一点通总题库中生成的一套四川省安全员C证考试资料&#xff0c;安全生产模拟考试一点通上四川省安全员C证作业手机同步练习。2024年【四川省安全员C证】考试题及四川省安全员…

SUSTAINABILITY,SCIESSCI双检期刊还能投吗?

本期&#xff0c;小编给大家介绍的是一本MDPI出版社旗下SCIE&SSCI双检“毕业神刊”——SUSTAINABILITY。据悉&#xff0c;早在2024年1月&#xff0c;ElSEVIER旗下的Scopus数据库已暂停收录检索期刊SUSTAINABILITY所发表文章&#xff0c;同时重新评估是否继续收录该期刊。随…

Carsim高级开发:VS Connect通讯开发指南

文章目录 前言一、VS Connect 概念引入二、VS Connect 通讯框架三、Carsim 工程配置1、车辆模型配置2、procedure配置3、Run Control配置4、受控车辆名称配置 四、VS Connect Server代码1、打开Sln工程2、代码修改 五、VS Connect Client代码1、函数的调用关系2、carsim_variab…

BetterZip 5软件安装包下载+安装教程

BetterZip是一款功能强大的Mac解/压缩软件&#xff0c;可以满足用户对文件压缩、解压、加密和保护等方面的需求。以下是关于BetterZip软件的主要功能、特点和使用方法的详细介绍&#xff0c;以及对其用户友好度、稳定性和安全性的评价。 安 装 包 获 取 地 址: BetterZip 5-安…

配置完eslint没有用?

当你使用 npx eslint --init 生成配置文件后 你也配置好了.prettierrc 当你在代码写一点小问题的时候 发现eslint没有进行检查 原因是你生成的 .eslintrc.js中没有加上这个配置 extends: [.....plugin:prettier/recommended],加上以后重启vscode你会发现

基于flask的网站如何使用https加密通信-问题记录

文章目录 项目场景&#xff1a;问题1问题描述原因分析解决步骤解决方案 问题2问题描述原因分析解决方案 参考文章 项目场景&#xff1a; 项目场景&#xff1a;基于flask的网站使用https加密通信一文中遇到的问题记录 问题1 问题描述 使用下面的命令生成自签名的SSL/TLS证书和…

传统边界安全设备的前世今生

光看不行得防御 只能抵御已知规则 识别病毒文件 识别方式是将数据包还原成文件&#xff0c;然后对文件进行病毒检测&#xff0c;检测方式就是以下三种 1、每一个文件都有一个独一无二的MD5值&#xff0c;把病毒文件的MD5值也进行记录&#xff0c;然后进行匹配 2、文件稍有变…

PS通过GTX实现SFP网络通信1

将 PS ENET1 的 GMII 接口和 MDIO 接口 通过 EMIO 方 式引出。在 PL 端将引出的 GMII 接口和 MDIO 接口与 IP 核 1G/2.5G Ethernet PCS/PMA or SGMII 连接&#xff0c; 1G/2.5G Ethernet PCS/PMA or SGMII 通过高速串行收发器 GTX 与 MIZ7035/7100 开发…

统计信号处理基础 习题解答10-17

题目&#xff1a; 在选择不含信息的或者不假设任何先验知识的先验PDF时,我们需要从数据中得到最大的信息量。在这种方式下,数据是了解未知参数的主要贡献者。利用习题10.15的结果,这种方法可以通过选择使I最大的来实现。对于例10.1的高斯先验PDF,该如何选择和2使得 是不含信息…

探索交互的本质:从指令到界面的演进与Linux基础指令的深入剖析

目录 1.指令 vs 界面//选读 1.1交互的需求 满足需求的第一阶段-指令 满足需求的第二阶段-界面 1.2 指令 和 界面交互 区别 2.操作系统介绍 2.1 举例说明 驱动软件层 2.2 为什么要有操作系统&#xff1f; 0x03 为什么要进行指令操作&#xff1f; 3.Linux基本指令 l…