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

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

@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
    @Override
    public 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 如果创建序列化器过程中发生错误。
     */
    @Override
    public 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
在测试输出数据后,即可输出一个与之对应字段的翻译。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

农场app开发,在“小小”的土地上开出“大大”的花

随着经济与科技的不断发展&#xff0c;人们对所供应的健康食品&#xff0c;提出了新的需求。即人们希望可以查到其产地、种植方式、采摘时间、有机、无机等多个层面。农场app的开发&#xff0c;致力于帮助人们满足这一具体化需求。 一&#xff0e; 农场app开发的底层逻辑 农场…

麒麟Kylin | 操作系统的安装与管理

以下所使用的环境为&#xff1a;VMware Workstation 17 Pro、Kylin-Server-10-SP2-x86-Release-Build09-20210524 一、创建虚拟机 在VMware主机单击【创建新的虚拟机】 **在新建虚拟机向导中选择【自定义】&#xff0c;然后点击【下一步】 ** 保持默认选项&#xff0c;然后…

SpringBoot修改banner

在resources目录下创建banner.txt文件 到该网站下选择banner https://www.bootschool.net/ascii-art 点击拷贝&#xff1a; 粘贴到banner.txt中&#xff0c;保存 重新运行项目即可&#xff1a;

Spring Boot集成websocket实现webrtc功能

1.什么是webrtc&#xff1f; WebRTC 是 Web 实时通信&#xff08;Real-Time Communication&#xff09;的缩写&#xff0c;它既是 API 也是协议。WebRTC 协议是两个 WebRTC Agent 协商双向安全实时通信的一组规则。开发人员可以通过 WebRTC API 使用 WebRTC 协议。目前 WebRTC…

游戏运营与发行:从入门到实践

&#x1f482; 个人网站:【 摸鱼游戏】【神级代码资源网站】【工具大全】&#x1f91f; 一站式轻松构建小程序、Web网站、移动应用&#xff1a;&#x1f449;注册地址&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交…

Java内存模型(JMM)详解

文章目录 1、Java内存模型2、JMM的核心概念1&#xff09;主内存与工作内存2&#xff09;内存可见性3&#xff09;JMM的三大特性&#xff1a;原子性、可见性、有序性。 3、JMM中的八种操作4、Happens-before 规则5、样例&#xff1a; 1、Java内存模型 Java内存模型&#xff08;…

Redis常见数据类型及其常用命令详解

文章目录 一、Redis概述二、Redis常用命令1.通用命令1.1 KEYS&#xff1a;查看符合模板的所有 key1.2 DEL&#xff1a;删除一个指定的 key1.3 EXISTS&#xff1a;判断 key 是否存在1.4 EXPIRE&#xff1a;给一个 key 设置有效期&#xff0c;有效期到期时该 key 会被自动删除1.5…

gridview自带编辑功能如何判断用户修改的值的合法性

在使用GridView的编辑功能更新值时&#xff0c;确保输入的值合法性是十分重要的。为了实现这一点&#xff0c;你可以在GridView的RowUpdating事件中加入代码来检查用户输入的值。如果发现输入的值不合法&#xff0c;你可以取消更新操作并向用户显示错误消息。下面是如何实现的步…

区区微服务,何足挂齿?

背景 睿哥前天吩咐我去了解一下微服务&#xff0c;我本来想周末看的&#xff0c;结果周末没带电脑&#xff0c;所以只能周一看了。刚刚我就去慕课网看了相关的视频&#xff0c;然后写一篇文章总结一下。这篇文章算是基础理论版&#xff0c;等我之后进行更多的实践&#xff0c;…

Matlab初识:什么是Matlab?它的历史、发展和应用领域

目录 一、什么是Matlab&#xff1f; 二、Matlab的历史与发展 三、Matlab的应用领域 四、安装和启动Matlab 五、界面介绍 六、第一个Matlab程序 七、总结 一、什么是Matlab&#xff1f; Matlab 是由 MathWorks 公司开发的一款用于数值计算、可视化以及编程的高级技术计算…

vue中axios从content-disposition响应头获取中文名

在Vue中使用axios请求文件时&#xff0c;服务器可能会返回带有Content-Disposition响应头的文件&#xff0c;其中可能包含文件名的编码信息。如果你需要解码这个文件名&#xff0c;可以使用JavaScript的内置URL API来处理。 Java中用于设置HTTP响应头的&#xff0c;通常在Web开…

HTML5新标签

HTML5 特点 新标签 <header>...<header> 头部标签 <footer>...<footer> 尾部标签 <section>...<section> 内容区块 <article>...&#xff0c;article> 表示页面中的独立内容 <aside>...<aside> 标签定义其所处…

JavaScript Window对象之(BOM、JS 执行机制、location对象、navigator对象、histroy对象、本地存储)

目录 1. BOM(浏览器对象模型)2. JS 执行机制3. location对象4. navigator对象5. histroy对象6. 本地存储6.1 localStorage6.2 sessionStorage 1. BOM(浏览器对象模型) BOM(Browser Object Model)是浏览器对象模型。其中window对象是JavaScript中一个全局的顶级对象基本的BOM属性…

定个小目标之刷LeetCode热题(23)

今天写这道题&#xff0c;背过八股文的都应该知道LRU算法缓存的基本原理&#xff0c;在 Java 语言中&#xff0c;同样有类似的数据结构 LinkedHashMap&#xff0c;本题我们采用自己创建哈希表双链表的形式简单实现一下 对于get操作&#xff1a;通过cache.get(key)获取&#xff…

【经典爬虫案例】用Python爬取微博热搜榜!

一、爬取目标 本次爬取的是: 微博热搜榜 &#xff08;代码也可直接在下方拿&#xff09;&#xff1a; ​ 分别爬取每条热搜的&#xff1a; 热搜标题、热搜排名、热搜类别、热度、链接地址。 下面&#xff0c;对页面进行分析。 经过分析&#xff0c;此页面没有XHR链接通过&am…

CSDN 自动上传图片并优化Markdown的图片显示

文章目录 完整代码一、上传资源二、替换 MD 中的引用文件为在线链接参考 完整代码 完整代码由两个文件组成&#xff0c;upload.py 和 main.py&#xff0c;放在同一目录下运行 main.py 就好&#xff01; # upload.py import requests class UploadPic: def __init__(self, c…

VBA学习(6): 调整工作表中所有图表尺寸并使其大小相同

有时候&#xff0c;我们想要将工作表中的所有图表进行缩放操作&#xff0c;且要求这些图表调整后的尺寸大小相同。如果使用手动拖放调整&#xff0c;看似大小相同&#xff0c;实际可能有差异。当然&#xff0c;也可以选取所有的图表后&#xff0c;在工作表选项卡中输入其宽度和…

TOP10!YashanDB斩获广东省优秀信创产品与解决方案双料荣誉

近日&#xff0c;2024广东软件风云榜结果出炉&#xff0c;表彰为广东软件产业和数字经济、新型工业化发展作出突出贡献的企业、企业家、优秀产品等。深算院崖山数据库系统 YashanDB荣获广东省“2024年优秀信息技术应用创新产品TOP10”和“2024年优秀信息技术应用创新行业应用解…

LeetCode 1789, 6, 138

目录 1789. 员工的直属部门题目链接表要求知识点思路代码 6. Z 字形变换题目链接标签思路代码 138. 随机链表的复制题目链接标签思路代码 1789. 员工的直属部门 题目链接 1789. 员工的直属部门 表 表Employee的字段为employee_id&#xff0c;department_id和primary_flag。…

SpringBoot购物网站

摘要 随着信息技术的高速发展&#xff0c;二十一世纪的网络技术和网络应用正在快速融入人们的生活&#xff0c;并且由于网络服务以及网络应用日渐普及&#xff0c;人们对于现在生活的需求也随之增长&#xff0c;而网上购物的便捷对人们的吸引力越来越大&#xff0c;购物网站可…