写点什么

Java 如何获取 @ApiModelProperty(value = “序列号“, name = “uuid“) 注解中的 value 值 name 值?

作者:bug菌
  • 2023-04-25
    上海
  • 本文字数:2637 字

    阅读完需:约 9 分钟

Java如何获取@ApiModelProperty(value = “序列号“, name = “uuid“)注解中的value值name值?

👨‍🎓作者:bug 菌

✏️博客:CSDN、掘金、infoQ、51CTO 等

🎉简介:CSDN 博客专家,C 站历届博客之星 Top50,掘金/InfoQ/51CTO 等社区优质创作者,全网粉丝合计 10w+,对一切技术感兴趣,重心偏 Java 方向;硬核公众号「 猿圈奇妙屋」,欢迎小伙伴们的加入,一起秃头,一起变强。

..

✍️温馨提醒:本文字数:1999 字, 阅读完需:约 5 分钟

        如果小伙伴们在批阅文章的过程中觉得文章对自己有帮助,请别吝啬手中的赞呀,大胆的把文章点亮👍,相信你点赞了好的文章,平台也会经常给你推荐高质量好文,您的点赞三连(收藏+关注+留言)就是对 bug 菌写文道路上最好的鼓励与支持😘。时光不弃🏃🏻‍♀️,创作不停💕,加油☘️

一、前言🔥

环境说明:Windows10 + Idea2021.3.2 + Jdk1.8 + SpringBoot 2.3.1.RELEASE

        近日 bug 菌在奋力赶项目,都是日常的接口逻辑实现,论复杂与否,也就论自己是否理解了业务,理解了其实写起来就顺。

        但是论前端有个不想接的活儿,她不想写死表列名,原本返回给她的数据结构是一个对象,key 自然是字段名,value 为具体的值,比如{"id":"1","name":"张三"},然后需求是要展示一张中文列名的表格,但是给后端而言,这无非是在增加工作量,我本来数据直接从数据库查询而来,这样,我还得替他插入中文注释。

        于是,活从天上来,谁让我是男生呢,那我就想办法给她实现一下吧,照顾一下女孩子,我仔细一下,我是采用对象来接收的,swagger 能将对于的字段名 展示中文注释,于是,我的灵感从这里而来。

        需求就是要将字段名对于的中文注释一并返回,比如返回格式:

需求前可得知:

{
    "id":"1",
    "name":"张三",
    "age":18
}

需求后:

{
    "value":"1",
    "name":"序号"
},
{
    "value":"张三",
    "name":"姓名"
},
{
    "value":18,
    "name":"年龄"
}

如果这个需求给你,你是否能有好的建议或者办法快速实现?

二、正文🔥

        这里我是想到了一点,大家请看,我们为了给 swagger 接口文档方便调用时能更直观看到每个字段代表啥,会添加 @ApiModelProperty 注解,给 value 属性添加中文注释。

​        所以,我们要实现这个需求,那我们便可以从这里出发,我们先获取数据,由于获取到的是一个对象,那我们便将对象通过强转成 map 集合,具体结构展示如下:

{    "id":"1",    "name":"张三",    "age":18}
复制代码

可以通过这种方法快速将对象转成 map:

BeanMap map = BeanMap.create(Object);
复制代码

​        然后我们就还需要做一件事,将 key 所对应的中文注释也一定转成 map 的形式,这样我们就可以通过 key 对比,来一一获取对应的中文注释了。

​        所以重点来了,怎么获取将字段名跟对应的中文注释获取到呢,比如如下格式:

{    "create_time":"创建时间",    "creator":"创建人",    "update_time":"修改时间",    "updator":"修改人"}
复制代码

​        我们就想到了,可以通过 java 反射,获取该类 BaseEntity 上的 @ApiModelProperty 注解的所有属性!这样我们再通过 map 给存放起来返回,这样不就获取到了!Good idea!我们来实现一下

三、代码实现🔥

​        接下来,我来展示下我的实现方式,仅供参考,如果有更好的方式实现,那么请一定要告诉 bug 菌,一起学习一起进步。

/** * 通过反射获取指定类@ApiModelProperty注解修饰的name值跟value值 */public static LinkedHashMap getApiModelProperty(String classPath) {
//定义一个可顺序集合存放 LinkedHashMap res = new LinkedHashMap();
try { // 1.根据类路径获取类 Class<?> c = Class.forName(classPath); // 2.获取类的属性 Field[] declaredFields = c.getDeclaredFields(); // 3.遍历属性,获取属性上ApiModelProperty的值,属性的名,存入res if (declaredFields.length != 0) { for (Field field : declaredFields) { if (field.getAnnotation(ApiModelProperty.class) != null) {
// 这存的key为注解的[name]类属性名,value为注解的[value]值 res.put(field.getName(), field.getAnnotation(ApiModelProperty.class).value()); } } return res; } } catch (ClassNotFoundException e) { e.printStackTrace(); } return null;}
复制代码

​        获取获取指定类,你也可以这样写:但是这样就不是很灵活了,这种指定类写法。

Class<BaseEntity> aClass = BaseEntity.class;Field[] declaredFields = aClass.getDeclaredFields();
复制代码

​        其中,我来解释一下:我们通过遍历拿到 field 对象,我们可以对其进行属性获取,就这样写:field.getAnnotation(ApiModelProperty.class),然后再点,就可以拿到该注解的所有属性了,比如获取 value,可以调用 value()方法等。

​        注释我写的很详细,其实这也是通过方法,我们也可以将该注解 @ApiModelProperty 换成其他的,都是一样的获取注解属性值,所以你们可以举一反三。比如我换成 @TableField 注解。

然后写法就直接改成这样即可。

​        最后,我们来写个 main 方法调用一下,测试一下,结果是否拿到了。

public static void main(String[] args) {    LinkedHashMap apiModelProperty = AopUtils.getApiModelProperty("com.example.demo.entity.BaseEntity");    System.out.println(apiModelProperty);}
复制代码

​        具体控制台打印请看如下:

        是不是成功了?哈哈,非常流批哦~~~最后,我们只需要遍历这两个 map 即可,根据 key 找到另一个 map 中的中文注释,这不是超级简单,我就不一一实现了,你们可以试着自己实现一下。

... ...

        ok,以上就是我这期的全部内容啦,如果还想学习更多,可以看看我的往期热文推荐哦,不积跬步,无以至千里; 不积小流,无以成江海,一口吃不成一个大胖子,加油!咱们下期拜拜~~

文末🔥

        我是 bug 菌,一名想走👣出大山改变命运的程序猿。接下来的路还很长,都等待着我们去突破、去挑战。来吧,小伙伴们,我们一起加油!未来皆可期,fighting!


感谢认真读完我博客的铁子萌,在这里呢送给大家一句话,不管你是在职还是在读,绝对终身受用。

时刻警醒自己:

抱怨没有用,一切靠自己;

想要过更好的生活,那就要逼着自己变的更强,生活加油!!!


发布于: 刚刚阅读数: 4
用户头像

bug菌

关注

公众号 | 猿圈奇妙屋 2020-07-30 加入

CSDN/阿里云/51CTO博客专家,历届博客之星Top30,掘金年度人气作者Top40,51CTO年度博主Top12,掘金/InfoQ/51CTO等社区优质创作者,全网粉丝合计10w+,硬核公众号「猿圈奇妙屋」,欢迎你的加入!免费领取海量资料。

评论

发布
暂无评论
Java如何获取@ApiModelProperty(value = “序列号“, name = “uuid“)注解中的value值name值?_三周年连更_bug菌_InfoQ写作社区