需求:

现在需要增加一个接口,前端传入空,后端返回字段的英文名和对应的中文名。

解决方案:

可以自定义一个注解,通过反射获取到注解以及注解的内容,再以map封装好返回给前端。
1)自定义注解类:

//指定注解使用的目标范围(类、方法、字段等)此处指定为字段
@Target({ElementType.FIELD})
//指定注解的生命周期(源码、class文件、运行时)
//此处为始终不会丢弃,运行期也保留该注解,自定义的注解通常使用这种方式
@Retention(RetentionPolicy.RUNTIME)
//指定子类可以继承父类的注解,只能是类上的注解,方法和字段的注解不能继承
@Inherited
public @interface NameMapping {String enName() default "";String chName() default "";//判断是否要返回该字段的中英文映射内容,默认为true,即返回boolean isBack() default true;
}

2)在需要返回中英文内容的字段上面添加该注解:

@Data
public class ProductRes extends ProductEntity implements Serializable {@ApiModelProperty("客户id")@NameMapping(enName = "customerId", chName = "客户id")private Long customerId;@ApiModelProperty("客户姓名")private String customerName;
}
@Data
public class ProductEntity extends BaseEntity {@ApiModelProperty("单位Id")private Long unitId;@ApiModelProperty("单位组Id")private Long unitGroupId;
}
@Data
public class BaseEntity implements Serializable {@ApiModelProperty("货品id")@NameMapping(enName = "productId", chName = "货品id")private Long productId;@ApiModelProperty("企业id")private Long corpId;@ApiModelProperty("价格")@NameMapping(enName = "price", chName = "价格")private BigDecimal price;
}

3)通过反射获取注解及注解内容:

@Override
public Response<Map<String, String>> productNameMappingDetail() {Map<String, String> map = new HashMap<>();//Class clazz = Class.forName("com.tiger.common.entity.product.response.ProductRes");ProductRes res = new ProductRes ();Class clazz = res.getClass();Field[] fields = clazz.getDeclaredFields();//获得被继承类的属性Class clazzSup = clazz.getSuperclass();Field[] fieldsSup = clazzSup.getDeclaredFields();Class clazzSupS = clazzSup.getSuperclass();Field[] fieldsSupS = clazzSupS.getDeclaredFields();for (Field field : fields) {//此处判断当前字段上是否有@NameMapping注解,没有的话就跳过if (field.getAnnotation(NameMapping.class) != null) {NameMapping nm = field.getAnnotation(NameMapping.class);map.put(nm.enName(), nm.chName());}}for (Field field : fieldsSup) {if (field.getAnnotation(NameMapping.class) != null) {NameMapping nm = field.getAnnotation(NameMapping.class);map.put(nm.enName(), nm.chName());}}for (Field field : fieldsSupS) {if (field.getAnnotation(NameMapping.class) != null) {NameMapping nm = field.getAnnotation(NameMapping.class);map.put(nm.enName(), nm.chName());}}return responseUtil.buildSuccessResponse(map);
}

此处需要注意的是,

getFields()可以获得本类及被继承类的所有public属性,而getDeclaredFields()可以获取到该类的全部属性,包括私有属性,但无法获得被继承类的属性。

所以我们要通clazz.getSuperclass()方法获得被继承类。

至此完成。

自定义注解(中英文字段名字映射)相关推荐

  1. 数据脱敏——基于Java自定义注解实现日志字段脱敏

    上文说了数据过敏主要有两个思路:第一个就是在序列化实体之前先把需要脱敏的字段进行处理,之后正常序列化:第二个就是在实体序列化的时候,对要脱敏的字段进行处理. 脱敏实现思路 这里探讨第一种方法,用基于自 ...

  2. Spring 自定义注解玩法大全,从入门到…

    在业务开发过程中我们会遇到形形色色的注解,但是框架自有的注解并不是总能满足复杂的业务需求,我们可以自定义注解来满足我们的需求. 根据注解使用的位置,文章将分成字段注解.方法.类注解来介绍自定义注解. ...

  3. @aspect注解_Spring自定义注解玩法大全,从入门到放弃

    在业务开发过程中我们会遇到形形色色的注解,但是框架自有的注解并不是总能满足复杂的业务需求,我们可以自定义注解来满足我们的需求. 根据注解使用的位置,文章将分成字段注解.方法.类注解来介绍自定义注解. ...

  4. 【SpringBoot】通过自定义注解对BigDecimal输出的小数位数进行格式化

    文章目录 前言 一.JsonSerializer 二.ContextualSerializer 三.实现 1.继承JsonSerializer类,实现ContextualSerializer接口 2. ...

  5. 基于自定义注解校验入参Model中的必传字段

    文章目录 一.概述 二.实现细节 1. 自定义注解 2. 工具类 3. Aop 三.使用方法 1. 定义Aop 2. Model中标识必传字段和嵌套Model 3. Controller层添加自定义注 ...

  6. java自定义字段_Java自定义注解实战

    注解简介 注解的本质是一个接口,该接口默认继承Annotation接口,使用@interface进行定义.注解主要有三类:元注解.自定义注解以及框架定义的注解. 接口里面的成员方法称为注解的属性 定义 ...

  7. Spring boot 少量字段不使用对象接收 自定义注解转成JSON格式

    一 自定义注解 /*** @author qujiawen* @version 1.0.0* @ClassName RequestJson.java* @Description TODO* @crea ...

  8. 使用自定义注解加密实体中手机号码字段

    通常我们数据库中带有用户手机号的数据,在展示给前端的时候,都需要进行部分加密,也就是真实手机号为15066668888的数据在加密返回给前端之后,应为150****8888 关于这个问题,解决方案很多 ...

  9. java 外部覆盖内部配置,Spring 与自定义注解、外部配置化的结合使用

    Spring 与自定义注解.外部配置化的结合使用 一.Java注解的简单介绍 注解,也叫Annotation.标注,是 Java 5 带来的新特性. 可使用范围 类.字段.方法.参数.构造函数.包等, ...

最新文章

  1. R语言ggplot2可视化数据点注释、标签显示不全、发生边界截断问题解决实战
  2. 解决if-else的另一种姿势:Map + 函数式接口方法!
  3. mysql - 要问 varchar 能存几个汉字? 能存几个 字母? 能存几个数字?请看下文讲解 (Java)
  4. 算法设计与分析———动态规划———最大子段和
  5. linux adduser mysql_linux_adduser
  6. PyTorch如何加速数据并行训练?分布式秘籍大揭秘
  7. 1从控制台输入年份,判断是闰年还是平年;
  8. android 缓冲区,android – 超过最小排队缓冲区数
  9. Http第三方接口实现/异步Http请求
  10. 论文阅读笔记(十二)——U-Net: Convolutional Networks for Biomedical Image Segmentation
  11. 算法设计与分析(第二版)上机实验题——C语言实现
  12. UE4影视特效学习资源整理
  13. 新媒体素材采集工具,帮你采集新媒体素材,提高效率
  14. 想不想制作一个Coreldraw 蝴蝶结呀这个是非常详细的教程
  15. python sep参数_Python中带有print()函数的sep参数
  16. 编曲宿主DAW是什么 2023年编曲宿主软件哪个好用
  17. 模板方法模式(java语言实现)
  18. Twitter首席科学家离职 高层动荡仍持续
  19. oracle 表数据删除后恢复还原
  20. 十分感谢--致谢好友的

热门文章

  1. Linux网络-UDP/TCP协议详解
  2. 锐龙R7 PRO 6850HS怎么样相当于什么水平级别
  3. Mysql工作原理介绍
  4. 【javaEE】网络编程套接字
  5. ASP.NET WEB API微信支付通知接口,返回xml数据,微信服务器不识别问题
  6. 北邮 计算机学院数据库实验报告二,北邮数据库_sql实验二报告.doc
  7. 二、Linux 文件与目录结构、VI/VIM 编辑器(重要)
  8. Windows 10 中的存储空间
  9. MySQL 数据库 day-03
  10. python自定义函数实例计算1-n的偶偶数和_Python入门--11--自定义函数