自定义注解(中英文字段名字映射)
需求:
现在需要增加一个接口,前端传入空,后端返回字段的英文名和对应的中文名。
解决方案:
可以自定义一个注解,通过反射获取到注解以及注解的内容,再以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()方法获得被继承类。
至此完成。
自定义注解(中英文字段名字映射)相关推荐
- 数据脱敏——基于Java自定义注解实现日志字段脱敏
上文说了数据过敏主要有两个思路:第一个就是在序列化实体之前先把需要脱敏的字段进行处理,之后正常序列化:第二个就是在实体序列化的时候,对要脱敏的字段进行处理. 脱敏实现思路 这里探讨第一种方法,用基于自 ...
- Spring 自定义注解玩法大全,从入门到…
在业务开发过程中我们会遇到形形色色的注解,但是框架自有的注解并不是总能满足复杂的业务需求,我们可以自定义注解来满足我们的需求. 根据注解使用的位置,文章将分成字段注解.方法.类注解来介绍自定义注解. ...
- @aspect注解_Spring自定义注解玩法大全,从入门到放弃
在业务开发过程中我们会遇到形形色色的注解,但是框架自有的注解并不是总能满足复杂的业务需求,我们可以自定义注解来满足我们的需求. 根据注解使用的位置,文章将分成字段注解.方法.类注解来介绍自定义注解. ...
- 【SpringBoot】通过自定义注解对BigDecimal输出的小数位数进行格式化
文章目录 前言 一.JsonSerializer 二.ContextualSerializer 三.实现 1.继承JsonSerializer类,实现ContextualSerializer接口 2. ...
- 基于自定义注解校验入参Model中的必传字段
文章目录 一.概述 二.实现细节 1. 自定义注解 2. 工具类 3. Aop 三.使用方法 1. 定义Aop 2. Model中标识必传字段和嵌套Model 3. Controller层添加自定义注 ...
- java自定义字段_Java自定义注解实战
注解简介 注解的本质是一个接口,该接口默认继承Annotation接口,使用@interface进行定义.注解主要有三类:元注解.自定义注解以及框架定义的注解. 接口里面的成员方法称为注解的属性 定义 ...
- Spring boot 少量字段不使用对象接收 自定义注解转成JSON格式
一 自定义注解 /*** @author qujiawen* @version 1.0.0* @ClassName RequestJson.java* @Description TODO* @crea ...
- 使用自定义注解加密实体中手机号码字段
通常我们数据库中带有用户手机号的数据,在展示给前端的时候,都需要进行部分加密,也就是真实手机号为15066668888的数据在加密返回给前端之后,应为150****8888 关于这个问题,解决方案很多 ...
- java 外部覆盖内部配置,Spring 与自定义注解、外部配置化的结合使用
Spring 与自定义注解.外部配置化的结合使用 一.Java注解的简单介绍 注解,也叫Annotation.标注,是 Java 5 带来的新特性. 可使用范围 类.字段.方法.参数.构造函数.包等, ...
最新文章
- R语言ggplot2可视化数据点注释、标签显示不全、发生边界截断问题解决实战
- 解决if-else的另一种姿势:Map + 函数式接口方法!
- mysql - 要问 varchar 能存几个汉字? 能存几个 字母? 能存几个数字?请看下文讲解 (Java)
- 算法设计与分析———动态规划———最大子段和
- linux adduser mysql_linux_adduser
- PyTorch如何加速数据并行训练?分布式秘籍大揭秘
- 1从控制台输入年份,判断是闰年还是平年;
- android 缓冲区,android – 超过最小排队缓冲区数
- Http第三方接口实现/异步Http请求
- 论文阅读笔记(十二)——U-Net: Convolutional Networks for Biomedical Image Segmentation
- 算法设计与分析(第二版)上机实验题——C语言实现
- UE4影视特效学习资源整理
- 新媒体素材采集工具,帮你采集新媒体素材,提高效率
- 想不想制作一个Coreldraw 蝴蝶结呀这个是非常详细的教程
- python sep参数_Python中带有print()函数的sep参数
- 编曲宿主DAW是什么 2023年编曲宿主软件哪个好用
- 模板方法模式(java语言实现)
- Twitter首席科学家离职 高层动荡仍持续
- oracle 表数据删除后恢复还原
- 十分感谢--致谢好友的
热门文章
- Linux网络-UDP/TCP协议详解
- 锐龙R7 PRO 6850HS怎么样相当于什么水平级别
- Mysql工作原理介绍
- 【javaEE】网络编程套接字
- ASP.NET WEB API微信支付通知接口,返回xml数据,微信服务器不识别问题
- 北邮 计算机学院数据库实验报告二,北邮数据库_sql实验二报告.doc
- 二、Linux 文件与目录结构、VI/VIM 编辑器(重要)
- Windows 10 中的存储空间
- MySQL 数据库 day-03
- python自定义函数实例计算1-n的偶偶数和_Python入门--11--自定义函数